// ***************************************************************************************************************************
// * 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;

import static org.apache.juneau.testutils.TestUtils.*;

import org.apache.juneau.annotation.*;
import org.junit.*;

/*
 * Tests the BEAN_examples property and @Example annotation.
 */
public class PojoExamplesTest {

	//====================================================================================================
	// test BEAN_examples
	//====================================================================================================
	@Test
	public void testProperty() throws Exception {
		BeanSession bs = BeanContext.create().example(A.class, new A().init()).build().createSession();
		assertObjectEquals("{f1:'f1a'}", bs.getClassMeta(A.class).getExample(bs));
	}

	public static class A {
		public String f1;

		public A init() {
			this.f1 = "f1a";
			return this;
		}
	}

	//====================================================================================================
	// test @Example on public field
	//====================================================================================================
	@Test
	public void testExampleField() throws Exception {
		BeanSession bs = BeanContext.create().build().createSession();
		assertObjectEquals("{f1:'f1b'}", bs.getClassMeta(B1.class).getExample(bs));
	}

	public static class B1 {
		public String f1;

		@Example
		public static B1 EXAMPLE = new B1().init();

		public B1 init() {
			this.f1 = "f1b";
			return this;
		}
	}

	@Test
	public void testExampleField_usingConfig() throws Exception {
		BeanSession bs = BeanContext.create().applyAnnotations(B1c.class).build().createSession();
		assertObjectEquals("{f1:'f1b'}", bs.getClassMeta(B1c.class).getExample(bs));
	}

	@BeanConfig(applyExample=@Example(on="B1c.EXAMPLE"))
	public static class B1c {
		public String f1;

		public static B1c EXAMPLE = new B1c().init();

		public B1c init() {
			this.f1 = "f1b";
			return this;
		}
	}

	//====================================================================================================
	// test @Example on private field
	//====================================================================================================
	@Test
	public void testExampleFieldPrivate() throws Exception {
		BeanSession bs = BeanContext.create().build().createSession();
		assertObjectEquals("{f1:'f1b'}", bs.getClassMeta(B2.class).getExample(bs));
	}

	public static class B2 {
		public String f1;

		@Example
		private static B2 EXAMPLE = new B2().init();

		public B2 init() {
			this.f1 = "f1b";
			return this;
		}
	}

	@Test
	public void testExampleFieldPrivate_usingConfig() throws Exception {
		BeanSession bs = BeanContext.create().applyAnnotations(B2c.class).build().createSession();
		assertObjectEquals("{f1:'f1b'}", bs.getClassMeta(B2c.class).getExample(bs));
	}

	@BeanConfig(applyExample=@Example(on="B2c.EXAMPLE"))
	public static class B2c {
		public String f1;

		@SuppressWarnings("unused")
		private static B2c EXAMPLE = new B2c().init();

		public B2c init() {
			this.f1 = "f1b";
			return this;
		}
	}

	//====================================================================================================
	// test @Example on public no-arg method.
	//====================================================================================================
	@Test
	public void testExampleOnPublicNoArgMethod() throws Exception {
		BeanSession bs = BeanContext.create().build().createSession();
		assertObjectEquals("{f1:'f1c'}", bs.getClassMeta(C1.class).getExample(bs));
	}

	public static class C1 {
		public String f1;

		public C1 init() {
			this.f1 = "f1c";
			return this;
		}

		@Example
		public static C1 x() {
			return new C1().init();
		}
	}

	@Test
	public void testExampleOnPublicNoArgMethod_usingConfig() throws Exception {
		BeanSession bs = BeanContext.create().applyAnnotations(C1c.class).build().createSession();
		assertObjectEquals("{f1:'f1c'}", bs.getClassMeta(C1c.class).getExample(bs));
	}

	@BeanConfig(applyExample=@Example(on="C1c.x"))
	public static class C1c {
		public String f1;

		public C1c init() {
			this.f1 = "f1c";
			return this;
		}

		public static C1c x() {
			return new C1c().init();
		}
	}

	//====================================================================================================
	// test @Example on private no-arg method.
	//====================================================================================================
	@Test
	public void testExampleOnPrivateNoArgMethod() throws Exception {
		BeanSession bs = BeanContext.create().build().createSession();
		assertObjectEquals("{f1:'f1c'}", bs.getClassMeta(C2.class).getExample(bs));
	}

	public static class C2 {
		public String f1;

		public C2 init() {
			this.f1 = "f1c";
			return this;
		}

		@Example
		private static C2 x() {
			return new C2().init();
		}
	}

	@Test
	public void testExampleOnPrivateNoArgMethod_usingConfig() throws Exception {
		BeanSession bs = BeanContext.create().applyAnnotations(C2c.class).build().createSession();
		assertObjectEquals("{f1:'f1c'}", bs.getClassMeta(C2c.class).getExample(bs));
	}

	@BeanConfig(applyExample=@Example(on="C2c.x"))
	public static class C2c {
		public String f1;

		public C2c init() {
			this.f1 = "f1c";
			return this;
		}

		@SuppressWarnings("unused")
		private static C2c x() {
			return new C2c().init();
		}
	}

	//====================================================================================================
	// test @Example on public 1-arg method
	//====================================================================================================
	@Test
	public void testExampleOnPublicOneArgMethod() throws Exception {
		BeanSession bs = BeanContext.create().build().createSession();
		assertObjectEquals("{f1:'f1d'}", bs.getClassMeta(D1.class).getExample(bs));
	}

	public static class D1 {
		public String f1;

		public D1 init() {
			this.f1 = "f1d";
			return this;
		}

		@Example
		public static D1 x(BeanSession bs) {
			return new D1().init();
		}
	}

	@Test
	public void testExampleOnPublicOneArgMethod_usingConfig() throws Exception {
		BeanSession bs = BeanContext.create().applyAnnotations(D1c.class).build().createSession();
		assertObjectEquals("{f1:'f1d'}", bs.getClassMeta(D1c.class).getExample(bs));
	}

	@BeanConfig(applyExample=@Example(on="D1c.x(BeanSession)"))
	public static class D1c {
		public String f1;

		public D1c init() {
			this.f1 = "f1d";
			return this;
		}

		public static D1c x(BeanSession bs) {
			return new D1c().init();
		}
	}

	//====================================================================================================
	// test example() method, no annotation.
	//====================================================================================================
	@Test
	public void testExampleMethod() throws Exception {
		BeanSession bs = BeanContext.create().build().createSession();
		assertObjectEquals("{f1:'f1e'}", bs.getClassMeta(E1.class).getExample(bs));
	}

	public static class E1 {
		public String f1;

		public E1 init() {
			this.f1 = "f1e";
			return this;
		}

		public static E1 example() {
			return new E1().init();
		}
	}

	//====================================================================================================
	// test example(BeanSession) method, no annotation.
	//====================================================================================================
	@Test
	public void testExampleBeanSessionMethod() throws Exception {
		BeanSession bs = BeanContext.create().build().createSession();
		assertObjectEquals("{f1:'f1e'}", bs.getClassMeta(E2.class).getExample(bs));
	}

	public static class E2 {
		public String f1;

		public E2 init() {
			this.f1 = "f1e";
			return this;
		}

		public static E2 example(BeanSession bs) {
			return new E2().init();
		}
	}

	//====================================================================================================
	// test invalid uses of @Example
	//====================================================================================================
	@Test
	public void testInvalidUsesOfExample() throws Exception {
		BeanSession bs = BeanContext.create().build().createSession();
		try {
			bs.getClassMeta(F1.class);
		} catch (Exception e) {
			assertContains(e.getMessage(), "@Example used on invalid method 'example(String)'");
		}
		try {
			bs.getClassMeta(F2.class);
		} catch (Exception e) {
			assertContains(e.getMessage(), "@Example used on invalid method 'example()'");
		}
		try {
			bs.getClassMeta(F3.class);
		} catch (Exception e) {
			assertContains(e.getMessage(), "@Example used on invalid field 'org.apache.juneau.PojoExamplesTest$F3.F3'");
		}
		try {
			bs.getClassMeta(F4.class);
		} catch (Exception e) {
			assertContains(e.getMessage(), "@Example used on invalid field 'org.apache.juneau.PojoExamplesTest$F4.f4'");
		}
	}

	public static class F1 {
		@Example
		public static F1 example(String s) {
			return null;
		}
	}
	public static class F2 {
		@Example
		public F2 example() {
			return null;
		}
	}
	public static class F3 {
		@Example
		public static String F3 = "foo";
	}
	public static class F4 {
		@Example
		public F4 f4 = new F4();
	}
}