package jpl.test;

import jpl.Query;
import jpl.Term;

// This class contains members which support those tests which are performed from Prolog.
// See also TestJUnit
public class Test {
	public Test() {
	}
	public Test(Term t) {
		this.termFromConstructor = t;
	}
	public Term					termFromConstructor;
	//
	public static boolean		fieldStaticBoolean;
	public static final boolean	fieldStaticBoolean1	= false;
	public static final boolean	fieldStaticBoolean2	= true;
	//
	public static char			fieldStaticChar;
	public static final char	fieldStaticChar1	= '\u0000';
	public static final char	fieldStaticChar2	= '\uFFFF';
	//
	public static byte			fieldStaticByte;
	public static final byte	fieldStaticByte1	= -(1 << 7);
	public static final byte	fieldStaticByte2	= -1;
	public static final byte	fieldStaticByte3	= 0;
	public static final byte	fieldStaticByte4	= 1;
	public static final byte	fieldStaticByte5	= (1 << 7) - 1;
	//
	public static short			fieldStaticShort;
	public static final short	fieldStaticShort1	= -(1 << 15);
	public static final short	fieldStaticShort2	= -(1 << 7);
	public static final short	fieldStaticShort3	= -1;
	public static final short	fieldStaticShort4	= 0;
	public static final short	fieldStaticShort5	= 1;
	public static final short	fieldStaticShort6	= (1 << 7) - 1;
	public static final short	fieldStaticShort7	= (1 << 15) - 1;
	//
	public static int			fieldStaticInt;
	public static final int		fieldStaticInt1		= -(1 << 31);
	public static final int		fieldStaticInt2		= -(1 << 15);
	public static final int		fieldStaticInt3		= -(1 << 7);
	public static final int		fieldStaticInt4		= -1;
	public static final int		fieldStaticInt5		= 0;
	public static final int		fieldStaticInt6		= 1;
	public static final int		fieldStaticInt7		= (1 << 7) - 1;
	public static final int		fieldStaticInt8		= (1 << 15) - 1;
	public static final int		fieldStaticInt9		= (1 << 31) - 1;
	//
	public static long			fieldStaticLong;
	public static final long	fieldStaticLong1	= -(1 << 63);
	public static final long	fieldStaticLong2	= -(1 << 31);
	public static final long	fieldStaticLong3	= -(1 << 15);
	public static final long	fieldStaticLong4	= -(1 << 7);
	public static final long	fieldStaticLong5	= -1;
	public static final long	fieldStaticLong6	= 0;
	public static final long	fieldStaticLong7	= 1;
	public static final long	fieldStaticLong8	= (1 << 7) - 1;
	public static final long	fieldStaticLong9	= (1 << 15) - 1;
	public static final long	fieldStaticLong10	= (1 << 31) - 1;
	public static final long	fieldStaticLong11	= (1 << 63) - 1;
	//
	public static float			fieldStaticFloat;
	public static final float	fieldStaticFloat1	= 12345.6789F;
	public static final float	fieldStaticFloat2	= 3.4e+38F;							// nearly MAX_VALUE
	public static final float	fieldStaticFloat3	= 1.4e-45F;							// nearly MIN_VALUE
	public static final float	fieldStaticFloat4	= 0.0F;
	public static final float	fieldStaticFloat5	= java.lang.Float.MIN_VALUE;
	public static final float	fieldStaticFloat6	= java.lang.Float.MAX_VALUE;
	public static final float	fieldStaticFloat7	= java.lang.Float.NEGATIVE_INFINITY;
	public static final float	fieldStaticFloat8	= java.lang.Float.POSITIVE_INFINITY;
	public static final float	fieldStaticFloat9	= java.lang.Float.NaN;
	//
	public static double		fieldStaticDouble;
	public static final double	fieldStaticDouble1	= 12345.6789D;
	public static final double	fieldStaticDouble2	= 2.3456789e+100D;
	public static final double	fieldStaticDouble3	= 3.456789e-100D;
	public static final double	fieldStaticDouble4	= 0.0D;
	public static final double	fieldStaticDouble5	= Double.MIN_VALUE;
	public static final double	fieldStaticDouble6	= Double.MAX_VALUE;
	public static final double	fieldStaticDouble7	= Double.NEGATIVE_INFINITY;
	public static final double	fieldStaticDouble8	= Double.POSITIVE_INFINITY;
	public static final double	fieldStaticDouble9	= Double.NaN;
	//
	public static Object[]		fieldStaticObjectArray; // can assign e.g. String[]
	public static long[]		fieldStaticLongArray; // cannot assign e.g. int[]
	//
	public static long fac(long n) { // complements jpl:jpl_test_fac(+integer,-integer)
		if (n == 1) {
			return 1;
		} else if (n > 1) {
			// return n * ((Integer) new Query(new Compound("jpl_test_fac", new Term[] { new Integer(n - 1), new Variable("F") })).oneSolution().get("F")).intValue();
			return n * ((jpl.Integer) Query.oneSolution("jpl_test_fac(?,F)", new Term[] {new jpl.Integer(n-1)}).get("F")).longValue();
		} else {
			return 0;
		}
	}
	static void packageMethod() { // not callable via JPL
		return;
	}
	public static void publicMethod() {
		return;
	}
	protected static void protectedMethod() { // not callable via JPL
		return;
	}
	private static void privateMethod() { // not callable via JPL
		return;
	}
	public boolean				fieldInstanceBoolean;
	public final boolean		fieldInstanceBoolean1	= false;
	public final boolean		fieldInstanceBoolean2	= true;
	public byte					fieldInstanceByte;
	public final byte			fieldInstanceByte1		= -(1 << 7);
	public final byte			fieldInstanceByte2		= -1;
	public final byte			fieldInstanceByte3		= 0;
	public final byte			fieldInstanceByte4		= 1;
	public final byte			fieldInstanceByte5		= (1 << 7) - 1;
	public char					fieldInstanceChar;
	public final char			fieldInstanceChar1		= '\u0000';
	public final char			fieldInstanceChar2		= '\uFFFF';
	public double				fieldInstanceDouble;
	public final double			fieldInstanceDouble1	= 12345.6789D;
	public final double			fieldInstanceDouble2	= 2.3456789e+100D;
	public final double			fieldInstanceDouble3	= 3.456789e-100D;
	public final double			fieldInstanceDouble4	= 0.0D;
	public final double			fieldInstanceDouble5	= Double.MIN_VALUE;
	public final double			fieldInstanceDouble6	= Double.MAX_VALUE;
	public final double			fieldInstanceDouble7	= Double.NEGATIVE_INFINITY;
	public final double			fieldInstanceDouble8	= Double.POSITIVE_INFINITY;
	public final double			fieldInstanceDouble9	= Double.NaN;
	public float				fieldInstanceFloat;
	public final float			fieldInstanceFloat1		= 12345.6789F;
	public final float			fieldInstanceFloat2		= 3.4e+38F;
	public final float			fieldInstanceFloat3		= 1.4e-45F;
	public final float			fieldInstanceFloat4		= 0.0F;
	public final float			fieldInstanceFloat5		= java.lang.Float.MIN_VALUE;
	public final float			fieldInstanceFloat6		= java.lang.Float.MAX_VALUE;
	public final float			fieldInstanceFloat7		= java.lang.Float.NEGATIVE_INFINITY;
	public final float			fieldInstanceFloat8		= java.lang.Float.POSITIVE_INFINITY;
	public final float			fieldInstanceFloat9		= java.lang.Float.NaN;
	public int					fieldInstanceInt;
	public final int			fieldInstanceInt1		= -(1 << 31);
	public final int			fieldInstanceInt2		= -(1 << 15);
	public final int			fieldInstanceInt3		= -(1 << 7);
	public final int			fieldInstanceInt4		= -1;
	public final int			fieldInstanceInt5		= 0;
	public final int			fieldInstanceInt6		= 1;
	public final int			fieldInstanceInt7		= (1 << 7) - 1;
	public final int			fieldInstanceInt8		= (1 << 15) - 1;
	public final int			fieldInstanceInt9		= (1 << 31) - 1;
	public long					fieldInstanceLong;
	public final long			fieldInstanceLong1		= -(1 << 63);
	public final long			fieldInstanceLong10		= (1 << 31) - 1;
	public final long			fieldInstanceLong11		= (1 << 63) - 1;
	public final long			fieldInstanceLong2		= -(1 << 31);
	public final long			fieldInstanceLong3		= -(1 << 15);
	public final long			fieldInstanceLong4		= -(1 << 7);
	public final long			fieldInstanceLong5		= -1;
	public final long			fieldInstanceLong6		= 0;
	public final long			fieldInstanceLong7		= 1;
	public final long			fieldInstanceLong8		= (1 << 7) - 1;
	public final long			fieldInstanceLong9		= (1 << 15) - 1;
	public short				fieldInstanceShort;
	public final short			fieldInstanceShort1		= -(1 << 15);
	public final short			fieldInstanceShort2		= -(1 << 7);
	public final short			fieldInstanceShort3		= -1;
	public final short			fieldInstanceShort4		= 0;
	public final short			fieldInstanceShort5		= 1;
	public final short			fieldInstanceShort6		= (1 << 7) - 1;
	public final short			fieldInstanceShort7		= (1 << 15) - 1;
	//
	public Term					term;															// obsolete
	public static Term			staticTerm;
	public Term					instanceTerm;
	//
	// for testing accessibility of non-public fields:
	static boolean				fieldPackageStaticBoolean;
	protected static boolean	fieldProtectedStaticBoolean;
	private static boolean		fieldPrivateStaticBoolean;
	//
	// for testing update of final field:
	public static final int		fieldStaticFinalInt		= 7;
	//
	// for testing passing general terms in from Prolog:
	public static Term			fieldStaticTerm;
	public Term					fieldInstanceTerm;
	public static boolean methodStaticTerm(Term t) {
		return t != null;
	}
	public boolean methodInstanceTerm(Term t) {
		return t != null;
	}
	public static Term methodStaticEchoTerm(Term t) {
		return t;
	}
	public static boolean methodStaticEchoBoolean(boolean v) {
		return v;
	}
	public static char methodStaticEchoChar(char v) {
		return v;
	}
	public static byte methodStaticEchoByte(byte v) {
		return v;
	}
	public static short methodStaticEchoShort(short v) {
		return v;
	}
	public static int methodStaticEchoInt(int v) {
		return v;
	}
	public static long methodStaticEchoLong(long v) {
		return v;
	}
	public static float methodStaticEchoFloat(float v) {
		return v;
	}
	public static double methodStaticEchoDouble(double v) {
		return v;
	}
	public Term methodInstanceTermEcho(Term t) {
		return t;
	}
	public static boolean methodStaticTermIsJNull(Term t) {
		return t.hasFunctor("@", 1) && t.arg(1).hasFunctor("null", 0);
	}
	public boolean methodInstanceTermIsJNull(Term t) {
		return t.hasFunctor("@", 1) && t.arg(1).hasFunctor("null", 0);
	}
	public static void hello() {
		System.out.println("hello");
	}
	public static boolean[] newArrayBooleanFromValue(boolean v) {
		boolean[] a = new boolean[1];
		a[0] = v;
		return a;
	}
	public static byte[] newArrayByteFromValue(byte v) {
		byte[] a = new byte[1];
		a[0] = v;
		return a;
	}
	public static char[] newArrayCharFromValue(char v) {
		char[] a = new char[1];
		a[0] = v;
		return a;
	}
	public static short[] newArrayShortFromValue(short v) {
		short[] a = new short[1];
		a[0] = v;
		return a;
	}
	public static int[] newArrayIntFromValue(int v) {
		int[] a = new int[1];
		a[0] = v;
		return a;
	}
	public static long[] newArrayLongFromValue(long v) {
		long[] a = new long[1];
		a[0] = v;
		return a;
	}
	public static float[] newArrayFloatFromValue(float v) {
		float[] a = new float[1];
		a[0] = v;
		return a;
	}
	public static double[] newArrayDoubleFromValue(double v) {
		double[] a = new double[1];
		a[0] = v;
		return a;
	}
	public static String methodStaticArray(long[] a) {
		return "long[]";
	}
	public static String methodStaticArray(int[] a) {
		return "int[]";
	}
	public static String methodStaticArray(short[] a) {
		return "short[]";
	}
}