// ***************************************************************************************************************************
// * 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.http.remote;

import static org.apache.juneau.assertions.Assertions.*;
import static org.junit.Assert.*;
import static org.junit.Assert.assertEquals;
import static org.junit.runners.MethodSorters.*;

import java.math.*;
import java.util.*;
import java.util.concurrent.atomic.*;

import org.apache.juneau.collections.*;
import org.apache.juneau.http.*;
import org.apache.juneau.http.annotation.*;
import org.apache.juneau.http.annotation.Header;
import org.apache.juneau.http.header.*;
import org.apache.juneau.jsonschema.annotation.*;
import org.apache.juneau.rest.RestRequest;
import org.apache.juneau.rest.annotation.*;
import org.apache.juneau.rest.client.*;
import org.apache.juneau.rest.mock.*;
import org.apache.juneau.testutils.*;
import org.apache.juneau.uon.*;
import org.junit.*;

@FixMethodOrder(NAME_ASCENDING)
public class Remote_HeaderAnnotation_Test {

	public static class Bean {
		public int f;

		public static Bean create() {
			Bean b = new Bean();
			b.f = 1;
			return b;
		}
	}

	//-----------------------------------------------------------------------------------------------------------------
	// Basic tests
	//-----------------------------------------------------------------------------------------------------------------

	@Rest
	public static class A {
		@RestMethod
		public String getA(@Header("*") OMap m) {
			m.removeAll("Accept-Encoding","Connection","Host","User-Agent");
			return m.toString();
		}
	}

	@Remote
	public static interface A1 {
		@RemoteMethod(path="a") String getX1(@Header("x") int b);
		@RemoteMethod(path="a") String getX2(@Header("x") float b);
		@RemoteMethod(path="a") String getX3(@Header("x") Bean b);
		@RemoteMethod(path="a") String getX4(@Header("*") Bean b);
		@RemoteMethod(path="a") String getX5(@Header Bean b);
		@RemoteMethod(path="a") String getX6(@Header("x") Bean[] b);
		@RemoteMethod(path="a") String getX7(@Header(n="x",cf="uon") Bean[] b);
		@RemoteMethod(path="a") String getX8(@Header("x") List<Bean> b);
		@RemoteMethod(path="a") String getX9(@Header(n="x",cf="uon") List<Bean> b);
		@RemoteMethod(path="a") String getX10(@Header("x") Map<String,Bean> b);
		@RemoteMethod(path="a") String getX11(@Header("*") Map<String,Bean> b);
		@RemoteMethod(path="a") String getX12(@Header Map<String,Bean> b);
		@RemoteMethod(path="a") String getX13(@Header(n="x",f="uon") Map<String,Bean> b);
		@RemoteMethod(path="a") String getX14(@Header(format="uon") Map<String,Bean> b);
		@RemoteMethod(path="a") String getX15(@Header("*") HeaderSupplier b);
		@RemoteMethod(path="a") String getX16(@Header HeaderSupplier b);
		@RemoteMethod(path="a") String getX17(@Header org.apache.http.Header b);
		@RemoteMethod(path="a") String getX18(@Header org.apache.http.Header[] b);
		@RemoteMethod(path="a") String getX19(@Header String b);
		@RemoteMethod(path="a") String getX20(@Header List<org.apache.http.Header> b);
	}

	@Test
	public void a01_objectTypes() throws Exception {
		A1 x = remote(A.class,A1.class);
		assertEquals("{x:'1'}",x.getX1(1));
		assertEquals("{x:'1.0'}",x.getX2(1));
		assertEquals("{x:'f=1'}",x.getX3(Bean.create()));
		assertEquals("{f:'1'}",x.getX4(Bean.create()));
		assertEquals("{f:'1'}",x.getX5(Bean.create()));
		assertEquals("{x:'f=1,f=1'}",x.getX6(new Bean[]{Bean.create(),Bean.create()}));
		assertEquals("{x:'@((f=1),(f=1))'}",x.getX7(new Bean[]{Bean.create(),Bean.create()}));
		assertEquals("{x:'f=1,f=1'}",x.getX8(AList.of(Bean.create(),Bean.create())));
		assertEquals("{x:'@((f=1),(f=1))'}",x.getX9(AList.of(Bean.create(),Bean.create())));
		assertEquals("{x:'k1=f\\\\=1'}",x.getX10(AMap.of("k1",Bean.create())));
		assertEquals("{k1:'f=1'}",x.getX11(AMap.of("k1",Bean.create())));
		assertEquals("{k1:'f=1'}",x.getX12(AMap.of("k1",Bean.create())));
		assertEquals("{x:'k1=f\\\\=1'}",x.getX13(AMap.of("k1",Bean.create())));
		assertEquals("{k1:'f=1'}",x.getX14(AMap.of("k1",Bean.create())));
		assertEquals("{foo:'bar'}",x.getX15(headers("foo","bar")));
		assertEquals("{foo:'bar'}",x.getX16(headers("foo","bar")));
		assertEquals("{foo:'bar'}",x.getX17(header("foo","bar")));
		assertEquals("{foo:'bar'}",x.getX18(new org.apache.http.Header[]{header("foo","bar")}));
		assertThrown(()->x.getX19("Foo")).contains("Invalid value type");
		assertEquals("{}",x.getX19(null));
		assertEquals("{foo:'bar'}",x.getX20(AList.of(header("foo","bar"))));
	}

	//-----------------------------------------------------------------------------------------------------------------
	// @Header(_default/allowEmptyValue)
	//-----------------------------------------------------------------------------------------------------------------

	@Rest
	public static class B {
		@RestMethod
		public String get(@Header("*") OMap m) {
			m.removeAll("Accept-Encoding","Connection","Host","User-Agent");
			return m.toString();
		}
	}

	@Remote
	public static interface B1 {
		@RemoteMethod(path="/") String getX1(@Header(n="x",df="foo") String b);
		@RemoteMethod(path="/") String getX2(@Header(n="x",df="foo",aev=true) String b);
		@RemoteMethod(path="/") String getX3(@Header(n="x",df="") String b);
		@RemoteMethod(path="/") String getX4(@Header(n="x",df="",aev=true) String b);
	}

	@Test
	public void b01_default_allowEmptyValue() throws Exception {
		B1 x = remote(B.class,B1.class);
		assertEquals("{x:'foo'}",x.getX1(null));
		assertThrown(()->x.getX1("")).contains("Empty value not allowed");
		assertEquals("{x:'foo'}",x.getX2(null));
		assertEquals("{x:''}",x.getX2(""));
		assertEquals("{x:''}",x.getX3(null));
		assertThrown(()->x.getX3("")).contains("Empty value not allowed");
		assertEquals("{x:''}",x.getX4(null));
		assertEquals("{x:''}",x.getX4(""));
	}

	//-----------------------------------------------------------------------------------------------------------------
	// @Header(collectionFormat)
	//-----------------------------------------------------------------------------------------------------------------

	@Rest
	public static class C {
		@RestMethod
		public String getA(@Header("*") OMap m) {
			m.removeAll("Accept-Encoding","Connection","Host","User-Agent");
			return m.toString();
		}
	}

	@Remote
	public static interface C1 {
		@RemoteMethod(path="/a") String getX1(@Header(n="x") String...b);
		@RemoteMethod(path="/a") String getX2(@Header(n="x",cf="csv") String...b);
		@RemoteMethod(path="/a") String getX3(@Header(n="x",cf="ssv") String...b);
		@RemoteMethod(path="/a") String getX4(@Header(n="x",cf="tsv") String...b);
		@RemoteMethod(path="/a") String getX5(@Header(n="x",cf="pipes") String...b);
		@RemoteMethod(path="/a") String getX6(@Header(n="x",cf="multi") String...b); // Not supported,but should be treated as csv.
		@RemoteMethod(path="/a") String getX7(@Header(n="x",cf="uon") String...b);
	}

	@Test
	public void c01_collectionFormat() throws Exception {
		C1 x = remote(C.class,C1.class);
		assertEquals("{x:'foo,bar'}",x.getX1("foo","bar"));
		assertEquals("{x:'foo,bar'}",x.getX2("foo","bar"));
		assertEquals("{x:'foo bar'}",x.getX3("foo","bar"));
		assertEquals("{x:'foo\\tbar'}",x.getX4("foo","bar"));
		assertEquals("{x:'foo|bar'}",x.getX5("foo","bar"));
		assertEquals("{x:'foo,bar'}",x.getX6("foo","bar"));
		assertEquals("{x:'@(foo,bar)'}",x.getX7("foo","bar"));
	}

	//-----------------------------------------------------------------------------------------------------------------
	// @Header(maximum,exclusiveMaximum,minimum,exclusiveMinimum)
	//-----------------------------------------------------------------------------------------------------------------

	@Rest
	public static class D {
		@RestMethod
		public String get(@Header("*") OMap m) {
			m.removeAll("Accept-Encoding","Connection","Host","User-Agent");
			return m.toString();
		}
	}

	@Remote
	public static interface D1 {
		@RemoteMethod(path="/") String getX1(@Header(n="x",min="1",max="10") int b);
		@RemoteMethod(path="/") String getX2(@Header(n="x",min="1",max="10",emin=false,emax=false) int b);
		@RemoteMethod(path="/") String getX3(@Header(n="x",min="1",max="10",emin=true,emax=true) int b);
		@RemoteMethod(path="/") String getX4(@Header(n="x",min="1",max="10") short b);
		@RemoteMethod(path="/") String getX5(@Header(n="x",min="1",max="10",emin=false,emax=false) short b);
		@RemoteMethod(path="/") String getX6(@Header(n="x",min="1",max="10",emin=true,emax=true) short b);
		@RemoteMethod(path="/") String getX7(@Header(n="x",min="1",max="10") long b);
		@RemoteMethod(path="/") String getX8(@Header(n="x",min="1",max="10",emin=false,emax=false) long b);
		@RemoteMethod(path="/") String getX9(@Header(n="x",min="1",max="10",emin=true,emax=true) long b);
		@RemoteMethod(path="/") String getX10(@Header(n="x",min="1",max="10") float b);
		@RemoteMethod(path="/") String getX11(@Header(n="x",min="1",max="10",emin=false,emax=false) float b);
		@RemoteMethod(path="/") String getX12(@Header(n="x",min="1",max="10",emin=true,emax=true) float b);
		@RemoteMethod(path="/") String getX13(@Header(n="x",min="1",max="10") double b);
		@RemoteMethod(path="/") String getX14(@Header(n="x",min="1",max="10",emin=false,emax=false) double b);
		@RemoteMethod(path="/") String getX15(@Header(n="x",min="1",max="10",emin=true,emax=true) double b);
		@RemoteMethod(path="/") String getX16(@Header(n="x",min="1",max="10") byte b);
		@RemoteMethod(path="/") String getX17(@Header(n="x",min="1",max="10",emin=false,emax=false) byte b);
		@RemoteMethod(path="/") String getX18(@Header(n="x",min="1",max="10",emin=true,emax=true) byte b);
		@RemoteMethod(path="/") String getX19(@Header(n="x",min="1",max="10") AtomicInteger b);
		@RemoteMethod(path="/") String getX20(@Header(n="x",min="1",max="10",emin=false,emax=false) AtomicInteger b);
		@RemoteMethod(path="/") String getX21(@Header(n="x",min="1",max="10",emin=true,emax=true) AtomicInteger b);
		@RemoteMethod(path="/") String getX22(@Header(n="x",min="1",max="10") BigDecimal b);
		@RemoteMethod(path="/") String getX23(@Header(n="x",min="1",max="10",emin=false,emax=false) BigDecimal b);
		@RemoteMethod(path="/") String getX24(@Header(n="x",min="1",max="10",emin=true,emax=true) BigDecimal b);
		@RemoteMethod(path="/") String getX25(@Header(n="x",min="1",max="10") Integer b);
		@RemoteMethod(path="/") String getX26(@Header(n="x",min="1",max="10",emin=false,emax=false) Integer b);
		@RemoteMethod(path="/") String getX27(@Header(n="x",min="1",max="10",emin=true,emax=true) Integer b);
		@RemoteMethod(path="/") String getX28(@Header(n="x",min="1",max="10") Short b);
		@RemoteMethod(path="/") String getX29(@Header(n="x",min="1",max="10",emin=false,emax=false) Short b);
		@RemoteMethod(path="/") String getX30(@Header(n="x",min="1",max="10",emin=true,emax=true) Short b);
		@RemoteMethod(path="/") String getX31(@Header(n="x",min="1",max="10") Long b);
		@RemoteMethod(path="/") String getX32(@Header(n="x",min="1",max="10",emin=false,emax=false) Long b);
		@RemoteMethod(path="/") String getX33(@Header(n="x",min="1",max="10",emin=true,emax=true) Long b);
		@RemoteMethod(path="/") String getX34(@Header(n="x",min="1",max="10") Float b);
		@RemoteMethod(path="/") String getX35(@Header(n="x",min="1",max="10",emin=false,emax=false) Float b);
		@RemoteMethod(path="/") String getX36(@Header(n="x",min="1",max="10",emin=true,emax=true) Float b);
		@RemoteMethod(path="/") String getX37(@Header(n="x",min="1",max="10") Double b);
		@RemoteMethod(path="/") String getX38(@Header(n="x",min="1",max="10",emin=false,emax=false) Double b);
		@RemoteMethod(path="/") String getX39(@Header(n="x",min="1",max="10",emin=true,emax=true) Double b);
		@RemoteMethod(path="/") String getX40(@Header(n="x",min="1",max="10") Byte b);
		@RemoteMethod(path="/") String getX41(@Header(n="x",min="1",max="10",emin=false,emax=false) Byte b);
		@RemoteMethod(path="/") String getX42(@Header(n="x",min="1",max="10",emin=true,emax=true) Byte b);
	}

	@Test
	public void d01_min_max_emin_emax() throws Exception {
		D1 x = remote(D.class,D1.class);
		assertEquals("{x:'1'}",x.getX1(1));
		assertEquals("{x:'10'}",x.getX1(10));
		assertThrown(()->x.getX1(0)).contains("Minimum value not met");
		assertThrown(()->x.getX1(11)).contains("Maximum value exceeded");
		assertEquals("{x:'1'}",x.getX2(1));
		assertEquals("{x:'10'}",x.getX2(10));
		assertThrown(()->x.getX2(0)).contains("Minimum value not met");
		assertThrown(()->x.getX2(11)).contains("Maximum value exceeded");
		assertEquals("{x:'2'}",x.getX3(2));
		assertEquals("{x:'9'}",x.getX3(9));
		assertThrown(()->x.getX3(1)).contains("Minimum value not met");
		assertThrown(()->x.getX3(10)).contains("Maximum value exceeded");
		assertEquals("{x:'1'}",x.getX4((short)1));
		assertEquals("{x:'10'}",x.getX4((short)10));
		assertThrown(()->x.getX4((short)0)).contains("Minimum value not met");
		assertThrown(()->x.getX4((short)11)).contains("Maximum value exceeded");
		assertEquals("{x:'1'}",x.getX5((short)1));
		assertEquals("{x:'10'}",x.getX5((short)10));
		assertThrown(()->x.getX5((short)0)).contains("Minimum value not met");
		assertThrown(()->x.getX5((short)11)).contains("Maximum value exceeded");
		assertEquals("{x:'2'}",x.getX6((short)2));
		assertEquals("{x:'9'}",x.getX6((short)9));
		assertThrown(()->x.getX6((short)1)).contains("Minimum value not met");
		assertThrown(()->x.getX6((short)10)).contains("Maximum value exceeded");
		assertEquals("{x:'1'}",x.getX7(1l));
		assertEquals("{x:'10'}",x.getX7(10l));
		assertThrown(()->x.getX7(0l)).contains("Minimum value not met");
		assertThrown(()->x.getX7(11l)).contains("Maximum value exceeded");
		assertEquals("{x:'1'}",x.getX8(1l));
		assertEquals("{x:'10'}",x.getX8(10l));
		assertThrown(()->x.getX8(0l)).contains("Minimum value not met");
		assertThrown(()->x.getX8(11l)).contains("Maximum value exceeded");
		assertEquals("{x:'2'}",x.getX9(2l));
		assertEquals("{x:'9'}",x.getX9(9l));
		assertThrown(()->x.getX9(1l)).contains("Minimum value not met");
		assertThrown(()->x.getX9(10l)).contains("Maximum value exceeded");
		assertEquals("{x:'1.0'}",x.getX10(1f));
		assertEquals("{x:'10.0'}",x.getX10(10f));
		assertThrown(()->x.getX10(0.9f)).contains("Minimum value not met");
		assertThrown(()->x.getX10(10.1f)).contains("Maximum value exceeded");
		assertEquals("{x:'1.0'}",x.getX11(1f));
		assertEquals("{x:'10.0'}",x.getX11(10f));
		assertThrown(()->x.getX11(0.9f)).contains("Minimum value not met");
		assertThrown(()->x.getX11(10.1f)).contains("Maximum value exceeded");
		assertEquals("{x:'1.1'}",x.getX12(1.1f));
		assertEquals("{x:'9.9'}",x.getX12(9.9f));
		assertThrown(()->x.getX12(1f)).contains("Minimum value not met");
		assertThrown(()->x.getX12(10f)).contains("Maximum value exceeded");
		assertEquals("{x:'1.0'}",x.getX13(1d));
		assertEquals("{x:'10.0'}",x.getX13(10d));
		assertThrown(()->x.getX13(0.9d)).contains("Minimum value not met");
		assertThrown(()->x.getX13(10.1d)).contains("Maximum value exceeded");
		assertEquals("{x:'1.0'}",x.getX14(1d));
		assertEquals("{x:'10.0'}",x.getX14(10d));
		assertThrown(()->x.getX14(0.9d)).contains("Minimum value not met");
		assertThrown(()->x.getX14(10.1d)).contains("Maximum value exceeded");
		assertEquals("{x:'1.1'}",x.getX15(1.1d));
		assertEquals("{x:'9.9'}",x.getX15(9.9d));
		assertThrown(()->x.getX15(1d)).contains("Minimum value not met");
		assertThrown(()->x.getX15(10d)).contains("Maximum value exceeded");
		assertEquals("{x:'1'}",x.getX16((byte)1));
		assertEquals("{x:'10'}",x.getX16((byte)10));
		assertThrown(()->x.getX16((byte)0)).contains("Minimum value not met");
		assertThrown(()->x.getX16((byte)11)).contains("Maximum value exceeded");
		assertEquals("{x:'1'}",x.getX17((byte)1));
		assertEquals("{x:'10'}",x.getX17((byte)10));
		assertThrown(()->x.getX17((byte)0)).contains("Minimum value not met");
		assertThrown(()->x.getX17((byte)11)).contains("Maximum value exceeded");
		assertEquals("{x:'2'}",x.getX18((byte)2));
		assertEquals("{x:'9'}",x.getX18((byte)9));
		assertThrown(()->x.getX18((byte)1)).contains("Minimum value not met");
		assertThrown(()->x.getX18((byte)10)).contains("Maximum value exceeded");
		assertEquals("{x:'1'}",x.getX19(new AtomicInteger(1)));
		assertEquals("{x:'10'}",x.getX19(new AtomicInteger(10)));
		assertThrown(()->x.getX19(new AtomicInteger(0))).contains("Minimum value not met");
		assertThrown(()->x.getX19(new AtomicInteger(11))).contains("Maximum value exceeded");
		assertEquals("{x:'1'}",x.getX20(new AtomicInteger(1)));
		assertEquals("{x:'10'}",x.getX20(new AtomicInteger(10)));
		assertThrown(()->x.getX20(new AtomicInteger(0))).contains("Minimum value not met");
		assertThrown(()->x.getX20(new AtomicInteger(11))).contains("Maximum value exceeded");
		assertEquals("{x:'2'}",x.getX21(new AtomicInteger(2)));
		assertEquals("{x:'9'}",x.getX21(new AtomicInteger(9)));
		assertThrown(()->x.getX21(new AtomicInteger(1))).contains("Minimum value not met");
		assertThrown(()->x.getX21(new AtomicInteger(10))).contains("Maximum value exceeded");
		assertEquals("{x:'1'}",x.getX22(new BigDecimal(1)));
		assertEquals("{x:'10'}",x.getX22(new BigDecimal(10)));
		assertThrown(()->x.getX22(new BigDecimal(0))).contains("Minimum value not met");
		assertThrown(()->x.getX22(new BigDecimal(11))).contains("Maximum value exceeded");
		assertEquals("{x:'1'}",x.getX23(new BigDecimal(1)));
		assertEquals("{x:'10'}",x.getX23(new BigDecimal(10)));
		assertThrown(()->x.getX23(new BigDecimal(0))).contains("Minimum value not met");
		assertThrown(()->x.getX23(new BigDecimal(11))).contains("Maximum value exceeded");
		assertEquals("{x:'2'}",x.getX24(new BigDecimal(2)));
		assertEquals("{x:'9'}",x.getX24(new BigDecimal(9)));
		assertThrown(()->x.getX24(new BigDecimal(1))).contains("Minimum value not met");
		assertThrown(()->x.getX24(new BigDecimal(10))).contains("Maximum value exceeded");
		assertEquals("{x:'1'}",x.getX25(1));
		assertEquals("{x:'10'}",x.getX25(10));
		assertThrown(()->x.getX25(0)).contains("Minimum value not met");
		assertThrown(()->x.getX25(11)).contains("Maximum value exceeded");
		assertEquals("{}",x.getX25(null));
		assertEquals("{x:'1'}",x.getX26(1));
		assertEquals("{x:'10'}",x.getX26(10));
		assertThrown(()->x.getX26(0)).contains("Minimum value not met");
		assertThrown(()->x.getX26(11)).contains("Maximum value exceeded");
		assertEquals("{}",x.getX26(null));
		assertEquals("{x:'2'}",x.getX27(2));
		assertEquals("{x:'9'}",x.getX27(9));
		assertThrown(()->x.getX27(1)).contains("Minimum value not met");
		assertThrown(()->x.getX27(10)).contains("Maximum value exceeded");
		assertEquals("{}",x.getX27(null));
		assertEquals("{x:'1'}",x.getX28((short)1));
		assertEquals("{x:'10'}",x.getX28((short)10));
		assertThrown(()->x.getX28((short)0)).contains("Minimum value not met");
		assertThrown(()->x.getX28((short)11)).contains("Maximum value exceeded");
		assertEquals("{}",x.getX28(null));
		assertEquals("{x:'1'}",x.getX29((short)1));
		assertEquals("{x:'10'}",x.getX29((short)10));
		assertThrown(()->x.getX29((short)0)).contains("Minimum value not met");
		assertThrown(()->x.getX29((short)11)).contains("Maximum value exceeded");
		assertEquals("{}",x.getX29(null));
		assertEquals("{x:'2'}",x.getX30((short)2));
		assertEquals("{x:'9'}",x.getX30((short)9));
		assertThrown(()->x.getX30((short)1)).contains("Minimum value not met");
		assertThrown(()->x.getX30((short)10)).contains("Maximum value exceeded");
		assertEquals("{}",x.getX30(null));
		assertEquals("{x:'1'}",x.getX31(1l));
		assertEquals("{x:'10'}",x.getX31(10l));
		assertThrown(()->x.getX31(0l)).contains("Minimum value not met");
		assertThrown(()->x.getX31(11l)).contains("Maximum value exceeded");
		assertEquals("{}",x.getX31(null));
		assertEquals("{x:'1'}",x.getX32(1l));
		assertEquals("{x:'10'}",x.getX32(10l));
		assertThrown(()->x.getX32(0l)).contains("Minimum value not met");
		assertThrown(()->x.getX32(11l)).contains("Maximum value exceeded");
		assertEquals("{}",x.getX32(null));
		assertEquals("{x:'2'}",x.getX33(2l));
		assertEquals("{x:'9'}",x.getX33(9l));
		assertThrown(()->x.getX33(1l)).contains("Minimum value not met");
		assertThrown(()->x.getX33(10l)).contains("Maximum value exceeded");
		assertEquals("{}",x.getX33(null));
		assertEquals("{x:'1.0'}",x.getX34(1f));
		assertEquals("{x:'10.0'}",x.getX34(10f));
		assertThrown(()->x.getX34(0.9f)).contains("Minimum value not met");
		assertThrown(()->x.getX34(10.1f)).contains("Maximum value exceeded");
		assertEquals("{}",x.getX34(null));
		assertEquals("{x:'1.0'}",x.getX35(1f));
		assertEquals("{x:'10.0'}",x.getX35(10f));
		assertThrown(()->x.getX35(0.9f)).contains("Minimum value not met");
		assertThrown(()->x.getX35(10.1f)).contains("Maximum value exceeded");
		assertEquals("{}",x.getX35(null));
		assertEquals("{x:'1.1'}",x.getX36(1.1f));
		assertEquals("{x:'9.9'}",x.getX36(9.9f));
		assertThrown(()->x.getX36(1f)).contains("Minimum value not met");
		assertThrown(()->x.getX36(10f)).contains("Maximum value exceeded");
		assertEquals("{}",x.getX36(null));
		assertEquals("{x:'1.0'}",x.getX37(1d));
		assertEquals("{x:'10.0'}",x.getX37(10d));
		assertThrown(()->x.getX37(0.9d)).contains("Minimum value not met");
		assertThrown(()->x.getX37(10.1d)).contains("Maximum value exceeded");
		assertEquals("{}",x.getX37(null));
		assertEquals("{x:'1.0'}",x.getX38(1d));
		assertEquals("{x:'10.0'}",x.getX38(10d));
		assertThrown(()->x.getX38(0.9d)).contains("Minimum value not met");
		assertThrown(()->x.getX38(10.1d)).contains("Maximum value exceeded");
		assertEquals("{}",x.getX38(null));
		assertEquals("{x:'1.1'}",x.getX39(1.1d));
		assertEquals("{x:'9.9'}",x.getX39(9.9d));
		assertThrown(()->x.getX39(1d)).contains("Minimum value not met");
		assertThrown(()->x.getX39(10d)).contains("Maximum value exceeded");
		assertEquals("{}",x.getX39(null));
		assertEquals("{x:'1'}",x.getX40((byte)1));
		assertEquals("{x:'10'}",x.getX40((byte)10));
		assertThrown(()->x.getX40((byte)0)).contains("Minimum value not met");
		assertThrown(()->x.getX40((byte)11)).contains("Maximum value exceeded");
		assertEquals("{}",x.getX40(null));
		assertEquals("{x:'1'}",x.getX41((byte)1));
		assertEquals("{x:'10'}",x.getX41((byte)10));
		assertThrown(()->x.getX41((byte)0)).contains("Minimum value not met");
		assertThrown(()->x.getX41((byte)11)).contains("Maximum value exceeded");
		assertEquals("{}",x.getX41(null));
		assertEquals("{x:'2'}",x.getX42((byte)2));
		assertEquals("{x:'9'}",x.getX42((byte)9));
		assertThrown(()->x.getX42((byte)1)).contains("Minimum value not met");
		assertThrown(()->x.getX42((byte)10)).contains("Maximum value exceeded");
		assertEquals("{}",x.getX42(null));
	}

	//-----------------------------------------------------------------------------------------------------------------
	// @Header(maxItems,minItems,uniqueItems)
	//-----------------------------------------------------------------------------------------------------------------

	@Rest
	public static class E {
		@RestMethod
		public String get(@Header("*") OMap m) {
			m.removeAll("Accept-Encoding","Connection","Host","User-Agent");
			return m.toString();
		}
	}

	@Remote
	public static interface E1 {
		@RemoteMethod(path="/") String getX1(@Header(n="x",cf="pipes",mini=1,maxi=2) String...b);
		@RemoteMethod(path="/") String getX2(@Header(n="x",items=@Items(cf="pipes",mini=1,maxi=2)) String[]...b);
		@RemoteMethod(path="/") String getX3(@Header(n="x",cf="pipes",ui=false) String...b);
		@RemoteMethod(path="/") String getX4(@Header(n="x",items=@Items(cf="pipes",ui=false)) String[]...b);
		@RemoteMethod(path="/") String getX5(@Header(n="x",cf="pipes",ui=true) String...b);
		@RemoteMethod(path="/") String getX6(@Header(n="x",items=@Items(cf="pipes",ui=true)) String[]...b);
	}

	@Test
	public void e01_mini_maxi_ui() throws Exception {
		E1 x = remote(E.class,E1.class);
		assertEquals("{x:'1'}",x.getX1("1"));
		assertEquals("{x:'1|2'}",x.getX1("1","2"));
		assertThrown(()->x.getX1()).contains("Minimum number of items not met");
		assertThrown(()->x.getX1("1","2","3")).contains("Maximum number of items exceeded");
		assertEquals("{x:null}",x.getX1((String)null));
		assertEquals("{x:'1'}",x.getX2(new String[]{"1"}));
		assertEquals("{x:'1|2'}",x.getX2(new String[]{"1","2"}));
		assertThrown(()->x.getX2(new String[]{})).contains("Minimum number of items not met");
		assertThrown(()->x.getX2(new String[]{"1","2","3"})).contains("Maximum number of items exceeded");
		assertEquals("{x:null}",x.getX2(new String[]{null}));
		assertEquals("{x:'1|1'}",x.getX3("1","1"));
		assertEquals("{x:'1|1'}",x.getX4(new String[]{"1","1"}));
		assertEquals("{x:'1|2'}",x.getX5("1","2"));
		assertThrown(()->x.getX5("1","1")).contains("Duplicate items not allowed");
		assertEquals("{x:'1|2'}",x.getX6(new String[]{"1","2"}));
		assertThrown(()->x.getX6(new String[]{"1","1"})).contains("Duplicate items not allowed");
	}

	//-----------------------------------------------------------------------------------------------------------------
	// @Header(maxLength,minLength,enum)
	//-----------------------------------------------------------------------------------------------------------------

	@Rest
	public static class F {
		@RestMethod
		public String get(@Header("*") OMap m) {
			m.removeAll("Accept-Encoding","Connection","Host","User-Agent");
			return m.toString();
		}
	}

	@Remote
	public static interface F1 {
		@RemoteMethod(path="/") String getX1(@Header(n="x",minl=2,maxl=3) String b);
		@RemoteMethod(path="/") String getX2(@Header(n="x",cf="pipes",items=@Items(minl=2,maxl=3)) String...b);
		@RemoteMethod(path="/") String getX3(@Header(n="x",e={"foo"}) String b);
		@RemoteMethod(path="/") String getX4(@Header(n="x",cf="pipes",items=@Items(e={"foo"})) String...b);
		@RemoteMethod(path="/") String getX5(@Header(n="x",p="foo\\d{1,3}") String b);
		@RemoteMethod(path="/") String getX6(@Header(n="x",cf="pipes",items=@Items(p="foo\\d{1,3}")) String...b);
	}

	@Test
	public void f01_minl_maxl_enum_p() throws Exception {
		F1 x = remote(F.class,F1.class);
		assertEquals("{x:'12'}",x.getX1("12"));
		assertEquals("{x:'123'}",x.getX1("123"));
		assertThrown(()->x.getX1("1")).contains("Minimum length of value not met");
		assertThrown(()->x.getX1("1234")).contains("Maximum length of value exceeded");
		assertEquals("{}",x.getX1(null));
		assertEquals("{x:'12|34'}",x.getX2("12","34"));
		assertEquals("{x:'123|456'}",x.getX2("123","456"));
		assertThrown(()->x.getX2("1","2")).contains("Minimum length of value not met");
		assertThrown(()->x.getX2("1234","5678")).contains("Maximum length of value exceeded");
		assertEquals("{x:'12|null'}",x.getX2("12",null));
		assertEquals("{x:'foo'}",x.getX3("foo"));
		assertThrown(()->x.getX3("bar")).contains("Value does not match one of the expected values.  Must be one of the following: ['foo']");
		assertEquals("{}",x.getX3(null));
		assertEquals("{x:'foo'}",x.getX4("foo"));
		assertThrown(()->x.getX4("bar")).contains("Value does not match one of the expected values.  Must be one of the following: ['foo']");
		assertEquals("{x:null}",x.getX4((String)null));
		assertEquals("{x:'foo123'}",x.getX5("foo123"));
		assertThrown(()->x.getX5("bar")).contains("Value does not match expected pattern");
		assertEquals("{}",x.getX5(null));
		assertEquals("{x:'foo123'}",x.getX6("foo123"));
		assertThrown(()->x.getX6("foo")).contains("Value does not match expected pattern");
		assertEquals("{x:null}",x.getX6((String)null));
	}

	//-----------------------------------------------------------------------------------------------------------------
	// @Header(multipleOf)
	//-----------------------------------------------------------------------------------------------------------------

	@Rest
	public static class G {
		@RestMethod
		public String get(@Header("*") OMap m) {
			m.removeAll("Accept-Encoding","Connection","Host","User-Agent");
			return m.toString();
		}
	}

	@Remote
	public static interface G1 {
		@RemoteMethod(path="/") String getX1(@Header(n="x",mo="2") int b);
		@RemoteMethod(path="/") String getX2(@Header(n="x",mo="2") short b);
		@RemoteMethod(path="/") String getX3(@Header(n="x",mo="2") long b);
		@RemoteMethod(path="/") String getX4(@Header(n="x",mo="2") float b);
		@RemoteMethod(path="/") String getX5(@Header(n="x",mo="2") double b);
		@RemoteMethod(path="/") String getX6(@Header(n="x",mo="2") byte b);
		@RemoteMethod(path="/") String getX7(@Header(n="x",mo="2") AtomicInteger b);
		@RemoteMethod(path="/") String getX8(@Header(n="x",mo="2") BigDecimal b);
		@RemoteMethod(path="/") String getX9(@Header(n="x",mo="2") Integer b);
		@RemoteMethod(path="/") String getX10(@Header(n="x",mo="2") Short b);
		@RemoteMethod(path="/") String getX11(@Header(n="x",mo="2") Long b);
		@RemoteMethod(path="/") String getX12(@Header(n="x",mo="2") Float b);
		@RemoteMethod(path="/") String getX13(@Header(n="x",mo="2") Double b);
		@RemoteMethod(path="/") String getX14(@Header(n="x",mo="2") Byte b);
	}

	@Test
	public void g01_multipleOf() throws Exception {
		G1 x = remote(G.class,G1.class);
		assertEquals("{x:'4'}",x.getX1(4));
		assertThrown(()->x.getX1(5)).contains("Multiple-of not met");
		assertEquals("{x:'4'}",x.getX2((short)4));
		assertThrown(()->x.getX2((short)5)).contains("Multiple-of not met");
		assertEquals("{x:'4'}",x.getX3(4));
		assertThrown(()->x.getX3(5)).contains("Multiple-of not met");
		assertEquals("{x:'4.0'}",x.getX4(4));
		assertThrown(()->x.getX4(5)).contains("Multiple-of not met");
		assertEquals("{x:'4.0'}",x.getX5(4));
		assertThrown(()->x.getX5(5)).contains("Multiple-of not met");
		assertEquals("{x:'4'}",x.getX6((byte)4));
		assertThrown(()->x.getX6((byte)5)).contains("Multiple-of not met");
		assertEquals("{x:'4'}",x.getX7(new AtomicInteger(4)));
		assertThrown(()->x.getX7(new AtomicInteger(5))).contains("Multiple-of not met");
		assertEquals("{x:'4'}",x.getX8(new BigDecimal(4)));
		assertThrown(()->x.getX8(new BigDecimal(5))).contains("Multiple-of not met");
		assertEquals("{x:'4'}",x.getX9(4));
		assertThrown(()->x.getX9(5)).contains("Multiple-of not met");
		assertEquals("{x:'4'}",x.getX10((short)4));
		assertThrown(()->x.getX10((short)5)).contains("Multiple-of not met");
		assertEquals("{x:'4'}",x.getX11(4l));
		assertThrown(()->x.getX11(5l)).contains("Multiple-of not met");
		assertEquals("{x:'4.0'}",x.getX12(4f));
		assertThrown(()->x.getX12(5f)).contains("Multiple-of not met");
		assertEquals("{x:'4.0'}",x.getX13(4d));
		assertThrown(()->x.getX13(5d)).contains("Multiple-of not met");
		assertEquals("{x:'4'}",x.getX14((byte)4));
		assertThrown(()->x.getX14((byte)5)).contains("Multiple-of not met");
	}

	//-----------------------------------------------------------------------------------------------------------------
	// @Header(required)
	//-----------------------------------------------------------------------------------------------------------------

	@Rest
	public static class H {
		@RestMethod
		public String get(@Header("*") OMap m) {
			m.removeAll("Accept-Encoding","Connection","Host","User-Agent");
			return m.toString();
		}
	}

	@Remote
	public static interface H1 {
		@RemoteMethod(path="/") String getX1(@Header(n="x") String b);
		@RemoteMethod(path="/") String getX2(@Header(n="x",r=false) String b);
		@RemoteMethod(path="/") String getX3(@Header(n="x",r=true) String b);
	}

	@Test
	public void h01_required() throws Exception {
		H1 x = remote(H.class,H1.class);
		assertEquals("{}",x.getX1(null));
		assertEquals("{}",x.getX2(null));
		assertEquals("{x:'1'}",x.getX3("1"));
		assertThrown(()->x.getX3(null)).contains("Required value not provided.");
	}

	//-----------------------------------------------------------------------------------------------------------------
	// @Header(skipIfEmpty)
	//-----------------------------------------------------------------------------------------------------------------

	@Rest
	public static class I {
		@RestMethod
		public String get(@Header("*") OMap m) {
			m.removeAll("Accept-Encoding","Connection","Host","User-Agent");
			return m.toString();
		}
	}

	@Remote
	public static interface I1 {
		@RemoteMethod(path="/") String getX1(@Header(n="x",aev=true) String b);
		@RemoteMethod(path="/") String getX2(@Header(n="x",aev=true,sie=false) String b);
		@RemoteMethod(path="/") String getX3(@Header(n="x",sie=true) String b);
	}

	@Test
	public void h01_skipIfEmpty() throws Exception {
		I1 x = remote(I.class,I1.class);
		assertEquals("{x:''}",x.getX1(""));
		assertEquals("{x:''}",x.getX2(""));
		assertEquals("{}",x.getX3(""));
	}

	//-----------------------------------------------------------------------------------------------------------------
	// @Header(serializer)
	//-----------------------------------------------------------------------------------------------------------------

	@Rest
	public static class J {
		@RestMethod
		public String get(@Header("*") OMap m) {
			m.removeAll("Accept-Encoding","Connection","Host","User-Agent");
			return m.toString();
		}
	}

	@Remote
	public static interface J1 {
		@RemoteMethod(path="/") String getX1(@Header(n="x",serializer=XPartSerializer.class) String b);
	}

	@Test
	public void j01_serializer() throws Exception {
		J1 x = remote(J.class,J1.class);
		assertEquals("{x:'xXx'}",x.getX1("X"));
	}

	//-----------------------------------------------------------------------------------------------------------------
	// RequestBean @Header
	//-----------------------------------------------------------------------------------------------------------------

	@Rest
	public static class K {
		@RestMethod
		public String get(RestRequest req) throws Exception {
			return req.getHeaders().subset("a,b,c,d,e,f,g,h,i,i1,i2,i3,a1,a2,a3,a4,b1,b2,b3,b4,c1,c2,c3,c4,e1,e2,e3,e4,f1,f2,f3,f4").toString(true);
		}
	}

	//-----------------------------------------------------------------------------------------------------------------
	// RequestBean @Header, Simple values
	//-----------------------------------------------------------------------------------------------------------------

	@Remote(path="/")
	public static interface K1 {
		@RemoteMethod(path="/") String getX1(@Request K1a rb);
		@RemoteMethod(path="/") String getX2(@Request(serializer=XSerializer.class) K1a rb);
	}

	public static class K1a {
		@Header
		public String getA() {
			return "a1";
		}
		@Header("b")
		public String getX1() {
			return "b1";
		}
		@Header(name="c")
		public String getX2() {
			return "c1";
		}
		@Header(name="e",allowEmptyValue=true)
		public String getX4() {
			return "";
		}
		@Header("f")
		public String getX5() {
			return null;
		}
		@Header("g")
		public String getX6() {
			return "true";
		}
		@Header("h")
		public String getX7() {
			return "123";
		}
		@Header(n="i1",sie=true)
		public String getX8() {
			return "foo";
		}
		@Header(n="i2",sie=true)
		public String getX9() {
			return "";
		}
		@Header(n="i3",sie=true)
		public String getX10() {
			return null;
		}
	}

	@Test
	public void k01_requestBean_simpleVals() throws Exception {
		K1 x1 = remote(K.class,K1.class);
		K1 x2 = client(K.class).partSerializer(UonSerializer.class).build().getRemote(K1.class);
		assertEquals("{a:'a1',b:'b1',c:'c1',e:'',g:'true',h:'123',i1:'foo'}",x1.getX1(new K1a()));
		assertEquals("{a:'a1',b:'b1',c:'c1',e:'',g:'\\'true\\'',h:'\\'123\\'',i1:'foo'}",x2.getX1(new K1a()));
		assertEquals("{a:'xa1x',b:'xb1x',c:'xc1x',e:'xx',g:'xtruex',h:'x123x',i1:'xfoox'}",x2.getX2(new K1a()));
	}

	//-----------------------------------------------------------------------------------------------------------------
	// RequestBean @Header,Maps
	//-----------------------------------------------------------------------------------------------------------------

	@Remote(path="/")
	public static interface K2 {
		@RemoteMethod(path="/") String getX1(@Request K2a rb);
		@RemoteMethod(path="/") String getX2(@Request(serializer=XSerializer.class) K2a rb);
	}

	public static class K2a {
		@Header
		public Map<String,Object> getA() {
			return AMap.of("a1","v1","a2",123,"a3",null,"a4","");
		}
		@Header("*")
		public Map<String,Object> getB() {
			return AMap.of("b1","true","b2","123","b3","null");
		}
		@Header(name="*",aev=true)
		public Map<String,Object> getC() {
			return AMap.of("c1","v1","c2",123,"c3",null,"c4","");
		}
		@Header("*")
		public Map<String,Object> getD() {
			return null;
		}
	}

	@Test
	public void k02_requestBean_maps() throws Exception {
		K2 x1 = remote(K.class,K2.class);
		K2 x2 = client(K.class).partSerializer(UonSerializer.class).build().getRemote(K2.class);
		assertEquals("{a:'a1=v1,a2=123,a3=null,a4=',b1:'true',b2:'123',b3:'null',c1:'v1',c2:'123',c4:''}",x1.getX1(new K2a()));
		assertEquals("{a:'(a1=v1,a2=123,a3=null,a4=\\'\\')',b1:'\\'true\\'',b2:'\\'123\\'',b3:'\\'null\\'',c1:'v1',c2:'123',c4:''}",x2.getX1(new K2a()));
		assertEquals("{a:'x{a1:\\'v1\\',a2:123,a3:null,a4:\\'\\'}x',b1:'xtruex',b2:'x123x',b3:'xnullx',c1:'xv1x',c2:'x123x',c4:'xx'}",x2.getX2(new K2a()));
	}

	//-----------------------------------------------------------------------------------------------------------------
	// RequestBean @Header, NameValuePairs
	//-----------------------------------------------------------------------------------------------------------------

	@Remote(path="/")
	public static interface K3 {
		@RemoteMethod(path="/") String getX1(@Request K3a rb);
		@RemoteMethod(path="/") String getX2(@Request(serializer=XSerializer.class) K3a rb);
	}

	public static class K3a {
		@Header(aev=true)
		public HeaderSupplier getA() {
			return headers("a1","v1","a2",123,"a3",null,"a4","");
		}
		@Header(value="*",aev=true)
		public HeaderSupplier getB() {
			return headers("b1","true","b2","123","b3","null");
		}
		@Header(n="*",aev=true)
		public HeaderSupplier getC() {
			return headers("c1","v1","c2",123,"c3",null,"c4","");
		}
		@Header(value="*",aev=true)
		public HeaderSupplier getD() {
			return null;
		}
		@Header(aev=true)
		public org.apache.http.Header[] getE() {
			return headers("e1","v1","e2",123,"e3",null,"e4","").toArray();
		}
		@Header(aev=true)
		public BasicHeader[] getF() {
			return headers("f1","v1","f2",123,"f3",null,"f4","").toArray(new BasicHeader[0]);
		}
	}

	@Test
	public void k03_requestBean_headers() throws Exception {
		K3 x1 = remote(K.class,K3.class);
		K3 x2 = client(K.class).partSerializer(UonSerializer.class).build().getRemote(K3.class);
		assertEquals("{a1:'v1',a2:'123',a4:'',b1:'true',b2:'123',b3:'null',c1:'v1',c2:'123',c4:'',e1:'v1',e2:'123',e4:'',f1:'v1',f2:'123',f4:''}",x1.getX1(new K3a()));
		assertEquals("{a1:'v1',a2:'123',a4:'',b1:'true',b2:'123',b3:'null',c1:'v1',c2:'123',c4:'',e1:'v1',e2:'123',e4:'',f1:'v1',f2:'123',f4:''}",x2.getX1(new K3a()));
		assertEquals("{a1:'v1',a2:'123',a4:'',b1:'true',b2:'123',b3:'null',c1:'v1',c2:'123',c4:'',e1:'v1',e2:'123',e4:'',f1:'v1',f2:'123',f4:''}",x2.getX2(new K3a()));
	}

	//-----------------------------------------------------------------------------------------------------------------
	// RequestBean @Header, Collections
	//-----------------------------------------------------------------------------------------------------------------

	@Remote(path="/")
	public static interface K4 {
		@RemoteMethod(path="/") String getX1(@Request K4a rb);
		@RemoteMethod(path="/") String getX2(@Request(serializer=XSerializer.class) K4a rb);
	}

	public static class K4a {
		@Header
		public List<Object> getA() {
			return AList.of("foo","","true","123","null",true,123,null);
		}
		@Header("b")
		public List<Object> getX1() {
			return AList.of("foo","","true","123","null",true,123,null);
		}
		@Header(name="c",serializer=ListSerializer.class)
		public List<Object> getX2() {
			return AList.of("foo","","true","123","null",true,123,null);
		}
		@Header(name="d",aev=true)
		public List<Object> getX3() {
			return AList.create();
		}
		@Header("e")
		public List<Object> getX4() {
			return null;
		}
		@Header("f")
		public Object[] getX5() {
			return new Object[]{"foo","","true","123","null",true,123,null};
		}
		@Header(name="g",serializer=ListSerializer.class)
		public Object[] getX6() {
			return new Object[]{"foo","","true","123","null",true,123,null};
		}
		@Header(name="h",aev=true)
		public Object[] getX7() {
			return new Object[]{};
		}
		@Header("i")
		public Object[] getX8() {
			return null;
		}
	}

	@Test
	public void k04_requestBean_collections() throws Exception {
		K4 x1 = remote(K.class,K4.class);
		K4 x2 = client(K.class).partSerializer(UonSerializer.class).build().getRemote(K4.class);
		assertEquals("{a:'foo,,true,123,null,true,123,null',b:'foo,,true,123,null,true,123,null',c:'foo||true|123|null|true|123|null',d:'',f:'foo,,true,123,null,true,123,null',g:'foo||true|123|null|true|123|null',h:''}",x1.getX1(new K4a()));
		assertEquals("{a:'@(foo,\\'\\',\\'true\\',\\'123\\',\\'null\\',true,123,null)',b:'@(foo,\\'\\',\\'true\\',\\'123\\',\\'null\\',true,123,null)',c:'foo||true|123|null|true|123|null',d:'@()',f:'@(foo,\\'\\',\\'true\\',\\'123\\',\\'null\\',true,123,null)',g:'foo||true|123|null|true|123|null',h:'@()'}",x2.getX1(new K4a()));
		assertEquals("{a:'fooXXtrueX123XnullXtrueX123Xnull',b:'fooXXtrueX123XnullXtrueX123Xnull',c:'foo||true|123|null|true|123|null',d:'',f:'fooXXtrueX123XnullXtrueX123Xnull',g:'foo||true|123|null|true|123|null',h:''}",x2.getX2(new K4a()));
	}

	//------------------------------------------------------------------------------------------------------------------
	// Helper methods.
	//------------------------------------------------------------------------------------------------------------------

	private static HeaderSupplier headers(Object...pairs) {
		return HeaderSupplier.ofPairs(pairs);
	}

	private static org.apache.http.Header header(String key,Object val) {
		return BasicStringHeader.of(key,val);
	}

	private static RestClientBuilder client(Class<?> c) {
		return MockRestClient.create(c);
	}

	private static <T> T remote(Class<?> rest,Class<T> t) {
		return MockRestClient.build(rest).getRemote(t);
	}
}
