// ***************************************************************************************************************************
// * 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.reflect.Mutaters.*;
import static org.junit.Assert.*;

import org.junit.*;

public class MutatersTest {

	//-----------------------------------------------------------------------------------------------------------------
	// Constructors.
	//-----------------------------------------------------------------------------------------------------------------

	public static class A {
		private String f;
		public A(String f) {
			this.f = f;
		}
		public A(int f) {
			this.f = String.valueOf(f);
		}
		public A(Integer f) {
			this.f = String.valueOf(f);
		}
	}
	@Test
	public void stringConstructor() {
		assertEquals("foo", get(String.class, A.class).mutate("foo").f);
	}
	@Test
	public void intConstructor() {
		assertEquals("1", get(int.class, A.class).mutate(1).f);
	}
	@Test
	public void integerConstructor() {
		assertEquals("2", get(Integer.class, A.class).mutate(2).f);
	}

	//-----------------------------------------------------------------------------------------------------------------
	// fromString methods.
	//-----------------------------------------------------------------------------------------------------------------

	public static class D1 {
		private String f;
		public static D1 create(String f) {
			D1 d = new D1(); d.f = f; return d;
		}
	}
	@Test
	public void fromString_create() {
		assertEquals("foo", get(String.class, D1.class).mutate("foo").f);
	}

	public static class D2 {
		private String f;
		public static D2 fromString(String f) {
			D2 d = new D2(); d.f = f; return d;
		}
	}
	@Test
	public void fromString_fromString() {
		assertEquals("foo", get(String.class, D2.class).mutate("foo").f);
	}

	public static class D3 {
		private String f;
		public static D3 fromValue(String f) {
			D3 d = new D3(); d.f = f; return d;
		}
	}
	@Test
	public void fromString_fromValue() {
		assertEquals("foo", get(String.class, D3.class).mutate("foo").f);
	}

	public static class D4 {
		private String f;
		public static D4 valueOf(String f) {
			D4 d = new D4(); d.f = f; return d;
		}
	}
	@Test
	public void fromString_valueOf() {
		assertEquals("foo", get(String.class, D4.class).mutate("foo").f);
	}

	public static class D5 {
		private String f;
		public static D5 parse(String f) {
			D5 d = new D5(); d.f = f; return d;
		}
	}
	@Test
	public void fromString_parse() {
		assertEquals("foo", get(String.class, D5.class).mutate("foo").f);
	}

	public static class D6 {
		private String f;
		public static D6 parseString(String f) {
			D6 d = new D6(); d.f = f; return d;
		}
	}
	@Test
	public void fromString_parseString() {
		assertEquals("foo", get(String.class, D6.class).mutate("foo").f);
	}

	public static class D7 {
		private String f;
		public static D7 forName(String f) {
			D7 d = new D7(); d.f = f; return d;
		}
	}
	@Test
	public void fromString_forName() {
		assertEquals("foo", get(String.class, D7.class).mutate("foo").f);
	}

	public static class D8 {
		private String f;
		public static D8 forString(String f) {
			D8 d = new D8(); d.f = f; return d;
		}
	}
	@Test
	public void fromString_forString() {
		assertEquals("foo", get(String.class, D8.class).mutate("foo").f);
	}

	//-----------------------------------------------------------------------------------------------------------------
	// fromX methods.
	//-----------------------------------------------------------------------------------------------------------------

	public static class X {}

	public static class E1 {
		private String f;
		public static E1 create(X x) {
			E1 e = new E1(); e.f = "ok"; return e;
		}
	}
	@Test
	public void fromX_create() {
		assertEquals("ok", get(X.class, E1.class).mutate(new X()).f);
	}

	public static class E2 {
		private String f;
		public static E2 fromX(X x) {
			E2 e = new E2(); e.f = "ok"; return e;
		}
	}
	@Test
	public void fromX_fromX() {
		assertEquals("ok", get(X.class, E2.class).mutate(new X()).f);
	}
}
