/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.solr.handler.dataimport;

import org.junit.Ignore;
import org.junit.Test;
import org.apache.solr.util.DateMathParser;

import java.text.SimpleDateFormat;
import java.util.*;

/**
 * <p>
 * Test for VariableResolver
 * </p>
 * 
 * 
 * @since solr 1.3
 */
public class TestVariableResolver extends AbstractDataImportHandlerTestCase {
  
  @Test
  public void testSimpleNamespace() {
    VariableResolver vri = new VariableResolver();
    Map<String,Object> ns = new HashMap<String,Object>();
    ns.put("world", "WORLD");
    vri.addNamespace("hello", ns);
    assertEquals("WORLD", vri.resolve("hello.world"));
  }
  
  @Test
  public void testDefaults() {
    // System.out.println(System.setProperty(TestVariableResolver.class.getName(),"hello"));
    System.setProperty(TestVariableResolver.class.getName(), "hello");
    // System.out.println("s.gP()"+
    // System.getProperty(TestVariableResolver.class.getName()));
    
    Properties p = new Properties();
    p.put("hello", "world");
    VariableResolver vri = new VariableResolver(p);
    Object val = vri.resolve(TestVariableResolver.class.getName());
    // System.out.println("val = " + val);
    assertEquals("hello", val);
    assertEquals("world", vri.resolve("hello"));
  }
  
  @Test
  public void testNestedNamespace() {
    VariableResolver vri = new VariableResolver();
    Map<String,Object> ns = new HashMap<String,Object>();
    ns.put("world", "WORLD");
    vri.addNamespace("hello", ns);
    ns = new HashMap<String,Object>();
    ns.put("world1", "WORLD1");
    vri.addNamespace("hello.my", ns);
    assertEquals("WORLD1", vri.resolve("hello.my.world1"));
  }
  
  @Test
  public void test3LevelNestedNamespace() {
    VariableResolver vri = new VariableResolver();
    Map<String,Object> ns = new HashMap<String,Object>();
    ns.put("world", "WORLD");
    vri.addNamespace("hello", ns);
    ns = new HashMap<String,Object>();
    ns.put("world1", "WORLD1");
    vri.addNamespace("hello.my.new", ns);
    assertEquals("WORLD1", vri.resolve("hello.my.new.world1"));
  }
  
  @Test
  public void dateNamespaceWithValue() {
    VariableResolver vri = new VariableResolver();
    vri.setEvaluators(new DataImporter().getEvaluators(Collections
        .<Map<String,String>> emptyList()));
    Map<String,Object> ns = new HashMap<String,Object>();
    Date d = new Date();
    ns.put("dt", d);
    vri.addNamespace("A", ns);
    assertEquals(
        new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ROOT).format(d),
        vri.replaceTokens("${dataimporter.functions.formatDate(A.dt,'yyyy-MM-dd HH:mm:ss')}"));
  }
  
  @Test
  public void dateNamespaceWithExpr() throws Exception {
    VariableResolver vri = new VariableResolver();
    vri.setEvaluators(new DataImporter().getEvaluators(Collections
        .<Map<String,String>> emptyList()));
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.ROOT);
    format.setTimeZone(TimeZone.getTimeZone("UTC"));
    DateMathParser dmp = new DateMathParser(TimeZone.getDefault(), Locale.ROOT);
    
    String s = vri
        .replaceTokens("${dataimporter.functions.formatDate('NOW/DAY','yyyy-MM-dd HH:mm')}");
    assertEquals(
        new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.ROOT).format(dmp.parseMath("/DAY")),
        s);
  }
  
  @Test
  public void testDefaultNamespace() {
    VariableResolver vri = new VariableResolver();
    Map<String,Object> ns = new HashMap<String,Object>();
    ns.put("world", "WORLD");
    vri.addNamespace(null, ns);
    assertEquals("WORLD", vri.resolve("world"));
  }
  
  @Test
  public void testDefaultNamespace1() {
    VariableResolver vri = new VariableResolver();
    Map<String,Object> ns = new HashMap<String,Object>();
    ns.put("world", "WORLD");
    vri.addNamespace(null, ns);
    assertEquals("WORLD", vri.resolve("world"));
  }
  
  @Test
  public void testFunctionNamespace1() throws Exception {
    VariableResolver resolver = new VariableResolver();
    final List<Map<String,String>> l = new ArrayList<Map<String,String>>();
    Map<String,String> m = new HashMap<String,String>();
    m.put("name", "test");
    m.put("class", E.class.getName());
    l.add(m);
    resolver.setEvaluators(new DataImporter().getEvaluators(l));
    ContextImpl context = new ContextImpl(null, resolver, null,
        Context.FULL_DUMP, Collections.EMPTY_MAP, null, null);
    
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.ROOT);
    format.setTimeZone(TimeZone.getTimeZone("UTC"));
    DateMathParser dmp = new DateMathParser(TimeZone.getDefault(),
        Locale.getDefault());
    
    String s = resolver
        .replaceTokens("${dataimporter.functions.formatDate('NOW/DAY','yyyy-MM-dd HH:mm')}");
    assertEquals(
        new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.ROOT).format(dmp.parseMath("/DAY")),
        s);
    assertEquals("Hello World",
        resolver.replaceTokens("${dataimporter.functions.test('TEST')}"));
  }
  
  public static class E extends Evaluator {
    @Override
    public String evaluate(String expression, Context context) {
      return "Hello World";
    }
  }
  
}

@@ -5408,36 +5408,20 @@
 t(),
-%0A        Locale.getDefault()
+ Locale.ROOT
 );%0A 

fix TestVariableResolver