// ***************************************************************************************************************************
// * 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.juneau.utils;

import static org.apache.juneau.internal.StringUtils.*;
import static org.junit.Assert.*;

import org.apache.juneau.svl.*;
import org.junit.*;

public class StringVarResolverTest {

	//====================================================================================================
	// test - Basic tests
	//====================================================================================================
	@Test
	public void test() throws Exception {
		VarResolver vr = new VarResolverBuilder().vars(XVar.class).build();
		String t;

		t = null;
		assertEquals(null, vr.resolve(t));

		t = "";
		assertEquals("", vr.resolve(t));

		t = "foo";
		assertEquals("foo", vr.resolve(t));

		t = "$X{y}";
		assertEquals("xyx", vr.resolve(t));

		t = "$X{y}x";
		assertEquals("xyxx", vr.resolve(t));

		t = "x$X{y}";
		assertEquals("xxyx", vr.resolve(t));

		t = "$X{y}$X{y}";
		assertEquals("xyxxyx", vr.resolve(t));

		t = "z$X{y}z$X{y}z";
		assertEquals("zxyxzxyxz", vr.resolve(t));

		t = "$X{$X{y}}";
		assertEquals("xxyxx", vr.resolve(t));

		t = "$X{z$X{y}z}";
		assertEquals("xzxyxzx", vr.resolve(t));

		t = "$X.{y}";
		assertEquals("$X.{y}", vr.resolve(t));

		t = "z$X.{y}z";
		assertEquals("z$X.{y}z", vr.resolve(t));

		t = "z$X.{$X.{z}}z";
		assertEquals("z$X.{$X.{z}}z", vr.resolve(t));

		// Non-existent vars
		t = "$Y{y}";
		assertEquals("$Y{y}", vr.resolve(t));

		t = "$Y{y}x";
		assertEquals("$Y{y}x", vr.resolve(t));

		t = "x$Y{y}";
		assertEquals("x$Y{y}", vr.resolve(t));

		// Incomplete vars
		// TODO - fix
//		t = "x$Y{y";
//		assertEquals("x$Y{y", vr.resolve(t));
	}

	public static class XVar extends SimpleVar {
		public XVar() {
			super("X");
		}
		@Override
		public String resolve(VarResolverSession session, String arg) {
			return "x" + arg + "x";
		}
	}

	//====================================================================================================
	// test - No-name variables
	//====================================================================================================
	@Test
	public void test2() throws Exception {
		VarResolver vr = new VarResolverBuilder().vars(BlankVar.class).build();
		String t;

		t = "${y}";
		assertEquals("xyx", vr.resolve(t));

		t = "${${y}}";
		assertEquals("xxyxx", vr.resolve(t));

		t = "${${y}${y}}";
		assertEquals("xxyxxyxx", vr.resolve(t));

		t = "z${z${y}z}z";
		assertEquals("zxzxyxzxz", vr.resolve(t));
	}

	public static class BlankVar extends SimpleVar {
		public BlankVar() {
			super("");
		}
		@Override
		public String resolve(VarResolverSession session, String arg) {
			return "x" + arg + "x";
		}
	}

	//====================================================================================================
	// test - No-name variables
	//====================================================================================================
	@Test
	public void testEscaped$() throws Exception {
		VarResolver vr = new VarResolverBuilder().vars(BlankVar.class).build();
		String t;

		t = "${y}";
		assertEquals("xyx", vr.resolve(t));
		t = "\\${y}";
		assertEquals("${y}", vr.resolve(t));

		t = "foo\\${y}foo";
		assertEquals("foo${y}foo", vr.resolve(t));

		// TODO - This doesn't work.
		//t = "${\\${y}}";
		//assertEquals("x${y}x", vr.resolve(t));
	}

	//====================================================================================================
	// test - Escape sequences.
	//====================================================================================================
	@Test
	public void testEscapedSequences() throws Exception {
		VarResolver vr = new VarResolverBuilder().vars(XVar.class).build();
		String t;
		char b = '\\';

		t = "A|A".replace('|',b);
		assertEquals("A|A".replace('|',b), vr.resolve(t));
		t = "A||A".replace('|',b);
		assertEquals("A|A".replace('|',b), vr.resolve(t));
		t = "A|A$X{B}".replace('|',b);
		assertEquals("A|AxBx".replace('|',b), vr.resolve(t));
		t = "A||A$X{B}".replace('|',b);
		assertEquals("A|AxBx".replace('|',b), vr.resolve(t));
		t = "A|$X{B}".replace('|',b);
		assertEquals("A$X{B}".replace('|',b), vr.resolve(t));
		t = "A||$X{B}".replace('|',b);
		assertEquals("A|xBx".replace('|',b), vr.resolve(t));
		t = "A$X|{B}".replace('|',b);
		assertEquals("A$X{B}".replace('|',b), vr.resolve(t));
		t = "A$X{B|}".replace('|',b);
		assertEquals("A$X{B}".replace('|',b), vr.resolve(t));
		t = "A$X{B}|".replace('|',b);
		assertEquals("AxBx|".replace('|',b), vr.resolve(t));
	}

	//====================================================================================================
	// Test $E variables
	//====================================================================================================
	@Test
	public void test$E() throws Exception {
		String t;

		t = "$E{PATH}";
		assertFalse(isEmpty(VarResolver.DEFAULT.resolve(t)));
	}

	//====================================================================================================
	// Test that StringResolver(parent) works as expected.
	//====================================================================================================
	@Test
	public void testParent() throws Exception {
		VarResolver vr = new VarResolverBuilder().defaultVars().vars(XMultipartVar.class).build();
		String t;
		System.setProperty("a", "a1");
		System.setProperty("b", "b1");

		t = "$X{$S{a},$S{b}}";
		assertEquals("a1+b1", vr.resolve(t));
		t = "$X{$S{a}}";
		assertEquals("a1", vr.resolve(t));
	}

	public static class XMultipartVar extends MultipartVar {
		public XMultipartVar() {
			super("X");
		}
		@Override /* MultipartVar */
		public String resolve(VarResolverSession session, String[] args) {
			return join(args, '+');
		}
	}

	//====================================================================================================
	// Test false triggers.
	//====================================================================================================
	@Test
	public void testFalseTriggers() throws Exception {
		VarResolverBuilder vrb = new VarResolverBuilder().defaultVars();
		String in = null;

		// Should reject names with characters outside A-Za-z
		for (Class<?> c : new Class[]{InvalidVar1.class, InvalidVar2.class, InvalidVar3.class, InvalidVar4.class, InvalidVar5.class}) {
			try {
				vrb.vars(c);
				fail();
			} catch (RuntimeException e) {
				// OK.
			}
		}

		VarResolver vr = vrb.build();

		// These should all be unchanged.
		in = "$@{foobar}";
		assertEquals(in, vr.resolve(in));
		in = "$[{foobar}";
		assertEquals(in, vr.resolve(in));
		in = "$`{foobar}";
		assertEquals(in, vr.resolve(in));
		in = "$|{foobar}";
		assertEquals(in, vr.resolve(in));
		in = "${{foobar}";
		assertEquals(in, vr.resolve(in));
		in = "${$foobar}";
		assertEquals(in, vr.resolve(in));

		System.setProperty("foobar", "baz");

		in = "$";
		assertEquals(in, vr.resolve(in));

		in = "$S";
		assertEquals(in, vr.resolve(in));

		in = "$S{";
		assertEquals(in, vr.resolve(in));

		in = "$S{foobar";

		assertEquals(in, vr.resolve(in));
		in = "$S{foobar}$";
		assertEquals("baz$", vr.resolve(in));

		in = "$S{foobar}$S";
		assertEquals("baz$S", vr.resolve(in));

		in = "$S{foobar}$S{";
		assertEquals("baz$S{", vr.resolve(in));

		in = "$S{foobar}$S{foobar";
		assertEquals("baz$S{foobar", vr.resolve(in));

		System.clearProperty("foobar");
		in = "$S{foobar}";

		// Test nulls returned by StringVar.
		// Should be converted to blanks.
		vrb.vars(AlwaysNullVar.class);

		vr = vrb.build();

		in = "$A{xxx}";
		assertEquals("", vr.resolve(in));
		in = "x$A{xxx}";
		assertEquals("x", vr.resolve(in));
		in = "$A{xxx}x";
		assertEquals("x", vr.resolve(in));
	}

	public static class AlwaysNullVar extends SimpleVar {
		public AlwaysNullVar() {
			super("A");
		}
		@Override
		public String resolve(VarResolverSession session, String key) {
			return null;
		}
	}

	public static class InvalidVar extends SimpleVar {
		public InvalidVar(String c) {
			super(c);
		}
		@Override
		public String resolve(VarResolverSession session, String key) {
			return null;
		}
	}

	public static class InvalidVar1 extends InvalidVar {
		public InvalidVar1() {
			super(null);
		}
	}
	public static class InvalidVar2 extends InvalidVar {
		public InvalidVar2() {
			super("@");
		}
	}
	public static class InvalidVar3 extends InvalidVar {
		public InvalidVar3() {
			super("[");
		}
	}
	public static class InvalidVar4 extends InvalidVar {
		public InvalidVar4() {
			super("`");
		}
	}
	public static class InvalidVar5 extends InvalidVar {
		public InvalidVar5() {
			super("|");
		}
	}
}
