]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.databoard/testcases/org/simantics/databoard/tests/TestBinding.java
Migrated source code from Simantics SVN
[simantics/platform.git] / bundles / org.simantics.databoard / testcases / org / simantics / databoard / tests / TestBinding.java
diff --git a/bundles/org.simantics.databoard/testcases/org/simantics/databoard/tests/TestBinding.java b/bundles/org.simantics.databoard/testcases/org/simantics/databoard/tests/TestBinding.java
new file mode 100644 (file)
index 0000000..2878de4
--- /dev/null
@@ -0,0 +1,769 @@
+/*******************************************************************************\r
+ *  Copyright (c) 2010 Association for Decentralized Information Management in\r
+ *  Industry THTH ry.\r
+ *  All rights reserved. This program and the accompanying materials\r
+ *  are made available under the terms of the Eclipse Public License v1.0\r
+ *  which accompanies this distribution, and is available at\r
+ *  http://www.eclipse.org/legal/epl-v10.html\r
+ *\r
+ *  Contributors:\r
+ *      VTT Technical Research Centre of Finland - initial API and implementation\r
+ *******************************************************************************/\r
+package org.simantics.databoard.tests;
+
+import static org.junit.Assert.assertEquals;\r
+import static org.junit.Assert.assertFalse;\r
+import static org.junit.Assert.assertNotNull;\r
+import static org.junit.Assert.assertNotSame;\r
+import static org.junit.Assert.assertTrue;\r
+\r
+import java.io.ByteArrayInputStream;\r
+import java.io.IOException;\r
+import java.io.InputStream;\r
+import java.util.Arrays;\r
+\r
+import org.junit.Test;\r
+import org.simantics.databoard.Bindings;\r
+import org.simantics.databoard.binding.Binding;\r
+import org.simantics.databoard.binding.IntegerBinding;\r
+import org.simantics.databoard.binding.MapBinding;\r
+import org.simantics.databoard.binding.error.BindingException;\r
+import org.simantics.databoard.binding.util.RandomValue;\r
+import org.simantics.databoard.parser.repository.DataTypeSyntaxError;\r
+import org.simantics.databoard.serialization.SerializationException;\r
+import org.simantics.databoard.serialization.Serializer;\r
+import org.simantics.databoard.serialization.SerializerConstructionException;\r
+import org.simantics.databoard.type.Datatype;\r
+import org.simantics.databoard.type.IntegerType;\r
+import org.simantics.databoard.type.StringType;\r
+
+/**
+ * This Test Case tests
+ *  o ReflectionBinding, GeneralBinding
+ *  o Boolean, Byte, Int, Long, Float, Double, String, Variant, Array, Map, Union, Record
+ *  o Create, Read
+ *  o Equals
+ *  o HashCode
+ *  o CompareTo (Binding & DataValueUtil)
+ *  o Clone
+ *  o Create Default
+ *  o Adaption between bindings
+ *  o Validator
+ *  o Serializer
+ *  o NullBinding Validator
+ *  o Ascii Print/Parse
+ *  o Recursion
+ *  
+ * TODO Test Range & Length Annotations
+ * TODO Test that map Sorts values
+ * TODO Test Data Types
+ *
+ * @author Toni Kalajainen <toni.kalajainen@vtt.fi>
+ */
+public class TestBinding extends TestData {
+       
+       public static boolean OMIT_PARSER_TEST = true;
+       
+       // boolean
+       @Test public void test_boolean() throws Exception {
+               assert_same(boolean_binding_ref, boolean_value_ref_0, boolean_binding_gen, boolean_value_gen_0);
+               assert_same(boolean_binding_ref, boolean_value_ref_1, boolean_binding_gen, boolean_value_gen_1);
+               assert_same(boolean_binding_ref, boolean_value_ref_0, boolean_binding_ref, boolean_value_ref_0);
+               assert_same(boolean_binding_gen, boolean_value_gen_0, boolean_binding_gen, boolean_value_gen_0);
+               assert_not_same(boolean_binding_ref, boolean_value_ref_0, boolean_binding_gen, boolean_value_gen_1);
+               assert_not_same(boolean_binding_ref, boolean_value_ref_1, boolean_binding_gen, boolean_value_gen_0);            
+               assert_not_same(boolean_binding_ref, boolean_value_ref_0, boolean_binding_ref, boolean_value_ref_1);
+               assert_not_same(boolean_binding_gen, boolean_value_gen_0, boolean_binding_gen, boolean_value_gen_1);
+               assert_valid(boolean_binding_ref, boolean_value_ref_0);
+               assert_valid(boolean_binding_ref, boolean_value_ref_1);
+               assert_valid(boolean_binding_gen, boolean_value_gen_0);
+               assert_valid(boolean_binding_gen, boolean_value_gen_1);
+       }
+               
+       // byte
+       @Test public void test_byte() throws Exception {
+               assert_same(byte_binding_ref, byte_value_ref_0, byte_binding_gen, byte_value_gen_0);
+               assert_same(byte_binding_ref, byte_value_ref_1, byte_binding_gen, byte_value_gen_1);
+               assert_same(byte_binding_ref, byte_value_ref_0, byte_binding_ref, byte_value_ref_0);
+               assert_same(byte_binding_gen, byte_value_gen_0, byte_binding_gen, byte_value_gen_0);
+               assert_not_same(byte_binding_ref, byte_value_ref_0, byte_binding_gen, byte_value_gen_1);
+               assert_not_same(byte_binding_ref, byte_value_ref_1, byte_binding_gen, byte_value_gen_0);                
+               assert_not_same(byte_binding_ref, byte_value_ref_0, byte_binding_ref, byte_value_ref_1);
+               assert_not_same(byte_binding_gen, byte_value_gen_0, byte_binding_gen, byte_value_gen_1);
+               assert_valid(byte_binding_ref, byte_value_ref_0);
+               assert_valid(byte_binding_ref, byte_value_ref_1);
+               assert_valid(byte_binding_gen, byte_value_gen_0);
+               assert_valid(byte_binding_gen, byte_value_gen_1);
+       }
+       
+       // integer
+       @Test public void test_integer() throws Exception {
+               assert_same(integer_binding_ref, integer_value_ref_0, integer_binding_gen, integer_value_gen_0);
+               assert_same(integer_binding_ref, integer_value_ref_1, integer_binding_gen, integer_value_gen_1);
+               assert_same(integer_binding_ref, integer_value_ref_0, integer_binding_ref, integer_value_ref_0);
+               assert_same(integer_binding_gen, integer_value_gen_0, integer_binding_gen, integer_value_gen_0);
+               assert_not_same(integer_binding_ref, integer_value_ref_0, integer_binding_gen, integer_value_gen_1);
+               assert_not_same(integer_binding_ref, integer_value_ref_1, integer_binding_gen, integer_value_gen_0);            
+               assert_not_same(integer_binding_ref, integer_value_ref_0, integer_binding_ref, integer_value_ref_1);
+               assert_not_same(integer_binding_gen, integer_value_gen_0, integer_binding_gen, integer_value_gen_1);
+               assert_valid(integer_binding_ref, integer_value_ref_0);
+               assert_valid(integer_binding_ref, integer_value_ref_1);
+               assert_valid(integer_binding_gen, integer_value_gen_0);
+               assert_valid(integer_binding_gen, integer_value_gen_1);
+       }
+       
+       // long
+       @Test public void test_long() throws Exception {
+               assert_same(long_binding_ref, long_value_ref_0, long_binding_gen, long_value_gen_0);
+               assert_same(long_binding_ref, long_value_ref_1, long_binding_gen, long_value_gen_1);
+               assert_same(long_binding_ref, long_value_ref_0, long_binding_ref, long_value_ref_0);
+               assert_same(long_binding_gen, long_value_gen_0, long_binding_gen, long_value_gen_0);
+               assert_not_same(long_binding_ref, long_value_ref_0, long_binding_gen, long_value_gen_1);
+               assert_not_same(long_binding_ref, long_value_ref_1, long_binding_gen, long_value_gen_0);                
+               assert_not_same(long_binding_ref, long_value_ref_0, long_binding_ref, long_value_ref_1);
+               assert_not_same(long_binding_gen, long_value_gen_0, long_binding_gen, long_value_gen_1);
+               assert_valid(long_binding_ref, long_value_ref_0);
+               assert_valid(long_binding_ref, long_value_ref_1);
+               assert_valid(long_binding_gen, long_value_gen_0);
+               assert_valid(long_binding_gen, long_value_gen_1);
+       }
+
+       // float
+       @Test public void test_float() throws Exception {
+               assert_same(float_binding_ref, float_value_ref_0, float_binding_gen, float_value_gen_0);
+               assert_same(float_binding_ref, float_value_ref_1, float_binding_gen, float_value_gen_1);
+               assert_same(float_binding_ref, float_value_ref_0, float_binding_ref, float_value_ref_0);
+               assert_same(float_binding_gen, float_value_gen_0, float_binding_gen, float_value_gen_0);
+               assert_not_same(float_binding_ref, float_value_ref_0, float_binding_gen, float_value_gen_1);
+               assert_not_same(float_binding_ref, float_value_ref_1, float_binding_gen, float_value_gen_0);            
+               assert_not_same(float_binding_ref, float_value_ref_0, float_binding_ref, float_value_ref_1);
+               assert_not_same(float_binding_gen, float_value_gen_0, float_binding_gen, float_value_gen_1);
+               assert_valid(float_binding_ref, float_value_ref_0);
+               assert_valid(float_binding_ref, float_value_ref_1);
+               assert_valid(float_binding_gen, float_value_gen_0);
+               assert_valid(float_binding_gen, float_value_gen_1);
+       }
+
+       // double
+       @Test public void test_double() throws Exception {
+               assert_same(double_binding_ref, double_value_ref_0, double_binding_gen, double_value_gen_0);
+               assert_same(double_binding_ref, double_value_ref_1, double_binding_gen, double_value_gen_1);
+               assert_same(double_binding_ref, double_value_ref_0, double_binding_ref, double_value_ref_0);
+               assert_same(double_binding_gen, double_value_gen_0, double_binding_gen, double_value_gen_0);
+               assert_not_same(double_binding_ref, double_value_ref_0, double_binding_gen, double_value_gen_1);
+               assert_not_same(double_binding_ref, double_value_ref_1, double_binding_gen, double_value_gen_0);                
+               assert_not_same(double_binding_ref, double_value_ref_0, double_binding_ref, double_value_ref_1);
+               assert_not_same(double_binding_gen, double_value_gen_0, double_binding_gen, double_value_gen_1);
+               assert_valid(double_binding_ref, double_value_ref_0);
+               assert_valid(double_binding_ref, double_value_ref_1);
+               assert_valid(double_binding_gen, double_value_gen_0);
+               assert_valid(double_binding_gen, double_value_gen_1);
+       }
+
+       // string
+       @Test public void test_string() throws Exception {
+               assert_same(string_binding_ref, string_value_ref_0, string_binding_gen, string_value_gen_0);
+               assert_same(string_binding_ref, string_value_ref_1, string_binding_gen, string_value_gen_1);
+               assert_same(string_binding_ref, string_value_ref_0, string_binding_ref, string_value_ref_0);
+               assert_same(string_binding_gen, string_value_gen_0, string_binding_gen, string_value_gen_0);
+               assert_not_same(string_binding_ref, string_value_ref_0, string_binding_gen, string_value_gen_1);
+               assert_not_same(string_binding_ref, string_value_ref_1, string_binding_gen, string_value_gen_0);                
+               assert_not_same(string_binding_ref, string_value_ref_0, string_binding_ref, string_value_ref_1);
+               assert_not_same(string_binding_gen, string_value_gen_0, string_binding_gen, string_value_gen_1);
+               assert_valid(string_binding_ref, string_value_ref_0);
+               assert_valid(string_binding_ref, string_value_ref_1);
+               assert_valid(string_binding_gen, string_value_gen_0);
+               assert_valid(string_binding_gen, string_value_gen_1);
+       }
+
+       // array
+       @Test public void test_array() throws Exception {
+               assert_same(array_binding_ref, array_value_ref_0, array_binding_gen, array_value_gen_0);
+               assert_same(array_binding_ref, array_value_ref_1, array_binding_gen, array_value_gen_1);
+               assert_same(array_binding_ref, array_value_ref_0, array_binding_ref, array_value_ref_0);
+               assert_same(array_binding_gen, array_value_gen_0, array_binding_gen, array_value_gen_0);
+               assert_not_same(array_binding_ref, array_value_ref_0, array_binding_gen, array_value_gen_1);
+               assert_not_same(array_binding_ref, array_value_ref_1, array_binding_gen, array_value_gen_0);            
+               assert_not_same(array_binding_ref, array_value_ref_0, array_binding_ref, array_value_ref_1);
+               assert_not_same(array_binding_gen, array_value_gen_0, array_binding_gen, array_value_gen_1);
+               assert_valid(array_binding_ref, array_value_ref_0);
+               assert_valid(array_binding_ref, array_value_ref_1);
+               assert_valid(array_binding_gen, array_value_gen_0);
+               assert_valid(array_binding_gen, array_value_gen_1);
+       }
+
+       // boolean_array
+       @Test public void test_boolean_array() throws Exception {
+               assert_same(boolean_array_binding_ref, boolean_array_value_ref_0, boolean_array_binding_gen, boolean_array_value_gen_0);
+               assert_same(boolean_array_binding_ref, boolean_array_value_ref_1, boolean_array_binding_gen, boolean_array_value_gen_1);
+               assert_same(boolean_array_binding_ref, boolean_array_value_ref_0, boolean_array_binding_ref, boolean_array_value_ref_0);
+               assert_same(boolean_array_binding_gen, boolean_array_value_gen_0, boolean_array_binding_gen, boolean_array_value_gen_0);
+               assert_not_same(boolean_array_binding_ref, boolean_array_value_ref_0, boolean_array_binding_gen, boolean_array_value_gen_1);
+               assert_not_same(boolean_array_binding_ref, boolean_array_value_ref_1, boolean_array_binding_gen, boolean_array_value_gen_0);            
+               assert_not_same(boolean_array_binding_ref, boolean_array_value_ref_0, boolean_array_binding_ref, boolean_array_value_ref_1);
+               assert_not_same(boolean_array_binding_gen, boolean_array_value_gen_0, boolean_array_binding_gen, boolean_array_value_gen_1);
+               assert_valid(boolean_array_binding_ref, boolean_array_value_ref_0);
+               assert_valid(boolean_array_binding_ref, boolean_array_value_ref_1);
+               assert_valid(boolean_array_binding_gen, boolean_array_value_gen_0);
+               assert_valid(boolean_array_binding_gen, boolean_array_value_gen_1);
+       }
+
+       // byte_array
+       @Test public void test_byte_array() throws Exception {
+               assert_same(byte_array_binding_ref, byte_array_value_ref_0, byte_array_binding_gen, byte_array_value_gen_0);
+               assert_same(byte_array_binding_ref, byte_array_value_ref_1, byte_array_binding_gen, byte_array_value_gen_1);
+               assert_same(byte_array_binding_ref, byte_array_value_ref_0, byte_array_binding_ref, byte_array_value_ref_0);
+               assert_same(byte_array_binding_gen, byte_array_value_gen_0, byte_array_binding_gen, byte_array_value_gen_0);
+               assert_not_same(byte_array_binding_ref, byte_array_value_ref_0, byte_array_binding_gen, byte_array_value_gen_1);
+               assert_not_same(byte_array_binding_ref, byte_array_value_ref_1, byte_array_binding_gen, byte_array_value_gen_0);                
+               assert_not_same(byte_array_binding_ref, byte_array_value_ref_0, byte_array_binding_ref, byte_array_value_ref_1);
+               assert_not_same(byte_array_binding_gen, byte_array_value_gen_0, byte_array_binding_gen, byte_array_value_gen_1);
+               assert_valid(byte_array_binding_ref, byte_array_value_ref_0);
+               assert_valid(byte_array_binding_ref, byte_array_value_ref_1);
+               assert_valid(byte_array_binding_gen, byte_array_value_gen_0);
+               assert_valid(byte_array_binding_gen, byte_array_value_gen_1);
+       }
+
+       // int_array
+       @Test public void test_int_array() throws Exception {
+               assert_same(int_array_binding_ref, int_array_value_ref_0, int_array_binding_gen, int_array_value_gen_0);
+               assert_same(int_array_binding_ref, int_array_value_ref_1, int_array_binding_gen, int_array_value_gen_1);
+               assert_same(int_array_binding_ref, int_array_value_ref_0, int_array_binding_ref, int_array_value_ref_0);
+               assert_same(int_array_binding_gen, int_array_value_gen_0, int_array_binding_gen, int_array_value_gen_0);
+               assert_not_same(int_array_binding_ref, int_array_value_ref_0, int_array_binding_gen, int_array_value_gen_1);
+               assert_not_same(int_array_binding_ref, int_array_value_ref_1, int_array_binding_gen, int_array_value_gen_0);            
+               assert_not_same(int_array_binding_ref, int_array_value_ref_0, int_array_binding_ref, int_array_value_ref_1);
+               assert_not_same(int_array_binding_gen, int_array_value_gen_0, int_array_binding_gen, int_array_value_gen_1);
+               assert_valid(int_array_binding_ref, int_array_value_ref_0);
+               assert_valid(int_array_binding_ref, int_array_value_ref_1);
+               assert_valid(int_array_binding_gen, int_array_value_gen_0);
+               assert_valid(int_array_binding_gen, int_array_value_gen_1);
+       }
+       
+       // int_array_2d
+       @Test public void test_int_array_2d() throws Exception {
+               assert_same(int_array_2d_binding_ref, int_array_2d_value_ref_0, int_array_2d_binding_gen, int_array_2d_value_gen_0);
+               assert_same(int_array_2d_binding_ref, int_array_2d_value_ref_1, int_array_2d_binding_gen, int_array_2d_value_gen_1);
+               assert_same(int_array_2d_binding_ref, int_array_2d_value_ref_0, int_array_2d_binding_ref, int_array_2d_value_ref_0);
+               assert_same(int_array_2d_binding_gen, int_array_2d_value_gen_0, int_array_2d_binding_gen, int_array_2d_value_gen_0);
+               assert_not_same(int_array_2d_binding_ref, int_array_2d_value_ref_0, int_array_2d_binding_gen, int_array_2d_value_gen_1);
+               assert_not_same(int_array_2d_binding_ref, int_array_2d_value_ref_1, int_array_2d_binding_gen, int_array_2d_value_gen_0);                
+               assert_not_same(int_array_2d_binding_ref, int_array_2d_value_ref_0, int_array_2d_binding_ref, int_array_2d_value_ref_1);
+               assert_not_same(int_array_2d_binding_gen, int_array_2d_value_gen_0, int_array_2d_binding_gen, int_array_2d_value_gen_1);
+               assert_valid(int_array_2d_binding_ref, int_array_2d_value_ref_0);
+               assert_valid(int_array_2d_binding_ref, int_array_2d_value_ref_1);
+               assert_valid(int_array_2d_binding_gen, int_array_2d_value_gen_0);
+               assert_valid(int_array_2d_binding_gen, int_array_2d_value_gen_1);
+       }       
+
+       // long_array
+       @Test public void test_long_array() throws Exception {
+               assert_same(long_array_binding_ref, long_array_value_ref_0, long_array_binding_gen, long_array_value_gen_0);
+               assert_same(long_array_binding_ref, long_array_value_ref_1, long_array_binding_gen, long_array_value_gen_1);
+               assert_same(long_array_binding_ref, long_array_value_ref_0, long_array_binding_ref, long_array_value_ref_0);
+               assert_same(long_array_binding_gen, long_array_value_gen_0, long_array_binding_gen, long_array_value_gen_0);
+               assert_not_same(long_array_binding_ref, long_array_value_ref_0, long_array_binding_gen, long_array_value_gen_1);
+               assert_not_same(long_array_binding_ref, long_array_value_ref_1, long_array_binding_gen, long_array_value_gen_0);                
+               assert_not_same(long_array_binding_ref, long_array_value_ref_0, long_array_binding_ref, long_array_value_ref_1);
+               assert_not_same(long_array_binding_gen, long_array_value_gen_0, long_array_binding_gen, long_array_value_gen_1);
+               assert_valid(long_array_binding_ref, long_array_value_ref_0);
+               assert_valid(long_array_binding_ref, long_array_value_ref_1);
+               assert_valid(long_array_binding_gen, long_array_value_gen_0);
+               assert_valid(long_array_binding_gen, long_array_value_gen_1);
+       }
+
+       // float_array
+       @Test public void test_float_array() throws Exception {
+               assert_same(float_array_binding_ref, float_array_value_ref_0, float_array_binding_gen, float_array_value_gen_0);
+               assert_same(float_array_binding_ref, float_array_value_ref_1, float_array_binding_gen, float_array_value_gen_1);
+               assert_same(float_array_binding_ref, float_array_value_ref_0, float_array_binding_ref, float_array_value_ref_0);
+               assert_same(float_array_binding_gen, float_array_value_gen_0, float_array_binding_gen, float_array_value_gen_0);
+               assert_not_same(float_array_binding_ref, float_array_value_ref_0, float_array_binding_gen, float_array_value_gen_1);
+               assert_not_same(float_array_binding_ref, float_array_value_ref_1, float_array_binding_gen, float_array_value_gen_0);            
+               assert_not_same(float_array_binding_ref, float_array_value_ref_0, float_array_binding_ref, float_array_value_ref_1);
+               assert_not_same(float_array_binding_gen, float_array_value_gen_0, float_array_binding_gen, float_array_value_gen_1);
+               assert_valid(float_array_binding_ref, float_array_value_ref_0);
+               assert_valid(float_array_binding_ref, float_array_value_ref_1);
+               assert_valid(float_array_binding_gen, float_array_value_gen_0);
+               assert_valid(float_array_binding_gen, float_array_value_gen_1);
+       }
+       
+       // double_array
+       @Test public void test_double_array() throws Exception {
+               assert_same(double_array_binding_ref, double_array_value_ref_0, double_array_binding_gen, double_array_value_gen_0);
+               assert_same(double_array_binding_ref, double_array_value_ref_1, double_array_binding_gen, double_array_value_gen_1);
+               assert_same(double_array_binding_ref, double_array_value_ref_0, double_array_binding_ref, double_array_value_ref_0);
+               assert_same(double_array_binding_gen, double_array_value_gen_0, double_array_binding_gen, double_array_value_gen_0);
+               assert_not_same(double_array_binding_ref, double_array_value_ref_0, double_array_binding_gen, double_array_value_gen_1);
+               assert_not_same(double_array_binding_ref, double_array_value_ref_1, double_array_binding_gen, double_array_value_gen_0);                
+               assert_not_same(double_array_binding_ref, double_array_value_ref_0, double_array_binding_ref, double_array_value_ref_1);
+               assert_not_same(double_array_binding_gen, double_array_value_gen_0, double_array_binding_gen, double_array_value_gen_1);
+               assert_valid(double_array_binding_ref, double_array_value_ref_0);
+               assert_valid(double_array_binding_ref, double_array_value_ref_1);
+               assert_valid(double_array_binding_gen, double_array_value_gen_0);
+               assert_valid(double_array_binding_gen, double_array_value_gen_1);
+       }
+
+       // string_array
+       @Test public void test_string_array() throws Exception {
+               assert_same(string_array_binding_ref, string_array_value_ref_0, string_array_binding_gen, string_array_value_gen_0);
+               assert_same(string_array_binding_ref, string_array_value_ref_1, string_array_binding_gen, string_array_value_gen_1);
+               assert_same(string_array_binding_ref, string_array_value_ref_0, string_array_binding_ref, string_array_value_ref_0);
+               assert_same(string_array_binding_gen, string_array_value_gen_0, string_array_binding_gen, string_array_value_gen_0);
+               assert_not_same(string_array_binding_ref, string_array_value_ref_0, string_array_binding_gen, string_array_value_gen_1);
+               assert_not_same(string_array_binding_ref, string_array_value_ref_1, string_array_binding_gen, string_array_value_gen_0);                
+               assert_not_same(string_array_binding_ref, string_array_value_ref_0, string_array_binding_ref, string_array_value_ref_1);
+               assert_not_same(string_array_binding_gen, string_array_value_gen_0, string_array_binding_gen, string_array_value_gen_1);
+               assert_valid(string_array_binding_ref, string_array_value_ref_0);
+               assert_valid(string_array_binding_ref, string_array_value_ref_1);
+               assert_valid(string_array_binding_gen, string_array_value_gen_0);
+               assert_valid(string_array_binding_gen, string_array_value_gen_1);
+       }
+
+       // record
+       @Test public void test_record() throws Exception {
+               assert_same(record_binding_ref, record_value_ref_0, record_binding_gen, record_value_gen_0);
+               assert_same(record_binding_ref, record_value_ref_1, record_binding_gen, record_value_gen_1);
+               assert_same(record_binding_ref, record_value_ref_0, record_binding_ref, record_value_ref_0);
+               assert_same(record_binding_gen, record_value_gen_0, record_binding_gen, record_value_gen_0);
+               assert_not_same(record_binding_ref, record_value_ref_0, record_binding_gen, record_value_gen_1);
+               assert_not_same(record_binding_ref, record_value_ref_1, record_binding_gen, record_value_gen_0);                
+               assert_not_same(record_binding_ref, record_value_ref_0, record_binding_ref, record_value_ref_1);
+               assert_not_same(record_binding_gen, record_value_gen_0, record_binding_gen, record_value_gen_1);
+               assert_valid(record_binding_ref, record_value_ref_0);
+               assert_valid(record_binding_ref, record_value_ref_1);
+               assert_valid(record_binding_gen, record_value_gen_0);
+               assert_valid(record_binding_gen, record_value_gen_1);
+       }
+
+       // map
+       @Test public void test_map() throws Exception {
+               assert_same(map_binding_ref, map_value_ref_0, map_binding_gen, map_value_gen_0);
+               assert_same(map_binding_ref, map_value_ref_1, map_binding_gen, map_value_gen_1);
+               assert_same(map_binding_ref, map_value_ref_0, map_binding_ref, map_value_ref_0);
+               assert_same(map_binding_gen, map_value_gen_0, map_binding_gen, map_value_gen_0);
+               assert_not_same(map_binding_ref, map_value_ref_0, map_binding_gen, map_value_gen_1);
+               assert_not_same(map_binding_ref, map_value_ref_1, map_binding_gen, map_value_gen_0);            
+               assert_not_same(map_binding_ref, map_value_ref_0, map_binding_ref, map_value_ref_1);
+               assert_not_same(map_binding_gen, map_value_gen_0, map_binding_gen, map_value_gen_1);
+               assert_valid(map_binding_ref, map_value_ref_0);
+               assert_valid(map_binding_ref, map_value_ref_1);
+               assert_valid(map_binding_gen, map_value_gen_0);
+               assert_valid(map_binding_gen, map_value_gen_1);
+               
+               test_ordered_map_binding(map_binding_ref);
+               test_ordered_map_binding(map_binding_gen);              
+       }
+
+       // optional
+       @Test public void test_optional() throws Exception {
+               assert_same(optional_binding_ref, optional_value_ref_0, optional_binding_gen, optional_value_gen_0);
+               assert_same(optional_binding_ref, optional_value_ref_1, optional_binding_gen, optional_value_gen_1);
+               assert_same(optional_binding_ref, optional_value_ref_0, optional_binding_ref, optional_value_ref_0);
+               assert_same(optional_binding_gen, optional_value_gen_0, optional_binding_gen, optional_value_gen_0);
+               assert_not_same(optional_binding_ref, optional_value_ref_0, optional_binding_gen, optional_value_gen_1);
+               assert_not_same(optional_binding_ref, optional_value_ref_1, optional_binding_gen, optional_value_gen_0);                
+               assert_not_same(optional_binding_ref, optional_value_ref_0, optional_binding_ref, optional_value_ref_1);
+               assert_not_same(optional_binding_gen, optional_value_gen_0, optional_binding_gen, optional_value_gen_1);
+               assert_valid(optional_binding_ref, optional_value_ref_0);
+               assert_valid(optional_binding_ref, optional_value_ref_1);
+               assert_valid(optional_binding_gen, optional_value_gen_0);
+               assert_valid(optional_binding_gen, optional_value_gen_1);
+       }
+
+       // union
+       @Test public void test_union() throws Exception {
+               assert_same(union_binding_ref, union_value_ref_0, union_binding_gen, union_value_gen_0);
+               assert_same(union_binding_ref, union_value_ref_1, union_binding_gen, union_value_gen_1);
+               assert_same(union_binding_ref, union_value_ref_0, union_binding_ref, union_value_ref_0);
+               assert_same(union_binding_gen, union_value_gen_0, union_binding_gen, union_value_gen_0);
+               assert_not_same(union_binding_ref, union_value_ref_0, union_binding_gen, union_value_gen_1);
+               assert_not_same(union_binding_ref, union_value_ref_1, union_binding_gen, union_value_gen_0);            
+               assert_not_same(union_binding_ref, union_value_ref_0, union_binding_ref, union_value_ref_1);
+               assert_not_same(union_binding_gen, union_value_gen_0, union_binding_gen, union_value_gen_1);
+               assert_valid(union_binding_ref, union_value_ref_0);
+               assert_valid(union_binding_ref, union_value_ref_1);
+               assert_valid(union_binding_gen, union_value_gen_0);
+               assert_valid(union_binding_gen, union_value_gen_1);
+       }
+       
+       // variant
+       @Test public void test_variant() throws Exception {
+               assert_same(variant_binding_ref, variant_value_ref_0, variant_binding_gen, variant_value_gen_0);
+               assert_same(variant_binding_ref, variant_value_ref_1, variant_binding_gen, variant_value_gen_1);
+               assert_same(variant_binding_ref, variant_value_ref_0, variant_binding_ref, variant_value_ref_0);
+               assert_same(variant_binding_gen, variant_value_gen_0, variant_binding_gen, variant_value_gen_0);
+               assert_not_same(variant_binding_ref, variant_value_ref_0, variant_binding_gen, variant_value_gen_1);
+               assert_not_same(variant_binding_ref, variant_value_ref_1, variant_binding_gen, variant_value_gen_0);            
+               assert_not_same(variant_binding_ref, variant_value_ref_0, variant_binding_ref, variant_value_ref_1);
+               assert_not_same(variant_binding_gen, variant_value_gen_0, variant_binding_gen, variant_value_gen_1);
+               assert_valid(variant_binding_ref, variant_value_ref_0);
+               assert_valid(variant_binding_ref, variant_value_ref_1);
+               assert_valid(variant_binding_gen, variant_value_gen_0);
+               assert_valid(variant_binding_gen, variant_value_gen_1);
+       }
+
+       // datatype
+       @Test public void test_datatype() throws Exception {
+               assert_same(datatype_binding_ref, datatype_value_ref_0, datatype_binding_ref, datatype_value_ref_0);
+               assert_not_same(datatype_binding_ref, datatype_value_ref_0, datatype_binding_ref, datatype_value_ref_1);
+               assert_valid(datatype_binding_ref, datatype_value_ref_1);
+
+               RandomValue rv = new RandomValue();
+               rv.refereableRecords = true;
+               
+               int iteration_count = 100;
+               for (int iteration = 0; iteration < iteration_count; iteration++) {
+                       int seed = iteration;
+                       rv.getRandom().setSeed(seed);
+                       rv.getRandom().nextLong();                      
+                       Binding b = datatype_binding_ref;
+                       Object rt = rv.randomType(0, 3);
+                       Serializer s = b.serializer();
+                       byte[] bytes = s.serialize( rt );
+                       Object rt2 = s.deserialize( bytes );
+                       b.assertInstaceIsValid(rt2);
+               }
+               
+       }
+       
+       // variant
+       @Test public void test_random_values() throws Exception {
+               int iteration_count = 10000;
+               
+               RandomValue rv = new RandomValue();
+               rv.refereableRecords = true;
+               for (int iteration = 0; iteration < iteration_count; iteration++) {                     
+                       int seed = iteration;
+                       rv.getRandom().setSeed(seed);
+                       rv.getRandom().nextLong();
+                       
+                       Object variant_value_gen_random_0 = variant_binding_gen.accept( rv );
+                       
+                       rv.getRandom().setSeed(seed);
+                       rv.getRandom().nextLong();                      
+                       Object variant_value_gen_random_1 = variant_binding_gen.accept( rv );
+                       
+                       assert_same(variant_binding_gen, variant_value_gen_random_0, variant_binding_gen, variant_value_gen_random_0);
+                       assert_same(variant_binding_gen, variant_value_gen_random_1, variant_binding_gen, variant_value_gen_random_1);
+                       assert_valid(variant_binding_gen, variant_value_gen_random_0);
+                       assert_valid(variant_binding_gen, variant_value_gen_random_1);
+               }
+       }       
+       
+       static void assert_same(Binding b1, Object o1, Binding b2, Object o2) throws BindingException, SerializationException, IOException, DataTypeSyntaxError, SerializerConstructionException
+       {
+               // DataType Test
+               assertEquals( b1.type(), b2.type() );
+               Datatype t = b1.type();
+               
+               // CompareTo Test
+               assertEquals(0, Bindings.compare(b1, o1, b2, o2) );
+               
+               // Equals Test
+               assertTrue( Bindings.equals(b1, o1, b2, o2) );
+               
+               // HashCode Test
+               int hash1 = b1.hashValue(o1);
+               int hash2 = b2.hashValue(o2);
+               assertEquals( hash1, hash2 );
+
+               // Validator Test
+               b1.assertInstaceIsValid(o1);
+               b2.assertInstaceIsValid(o2);
+               
+               // Default Value Test
+               Object x1 = b1.createDefault();
+               Object x2 = b2.createDefault();
+               b1.assertInstaceIsValid(x1);
+               b2.assertInstaceIsValid(x2);
+               assertEquals(0, Bindings.compare(b1, x1, b2, x2) );
+               assertTrue( Bindings.equals(b1, x1, b2, x2) );
+                               
+               // Clone Test
+               Object o1_ = Bindings.cloneUnchecked(o2, b2, b1);
+               Object o2_ = Bindings.cloneUnchecked(o1, b1, b2);
+               if (!b1.isImmutable() && !b2.isImmutable()) { 
+                       assertTrue(o1!=o1_);
+                       assertTrue(o2!=o2_);
+               }
+               assertEquals(0, b1.compare(o1, o1_));
+               assertEquals(0, b2.compare(o2, o2_));
+               assertTrue( b1.equals(o1, o1_) );               
+               assertTrue( b2.equals(o2, o2_) );                               
+               b1.assertInstaceIsValid(o1_);
+               b2.assertInstaceIsValid(o2_);
+               
+               o1_ = b1.cloneUnchecked(o1);
+               o2_ = b2.cloneUnchecked(o2);
+               if (!b1.isImmutable()) assertTrue(o1!=o1_);
+               if (!b2.isImmutable()) assertTrue(o2!=o2_);
+               assertEquals(0, b1.compare(o1, o1_));
+               assertEquals(0, b2.compare(o2, o2_));
+               assertTrue( b1.equals(o1, o1_) );               
+               assertTrue( b2.equals(o2, o2_) );                               
+               b1.assertInstaceIsValid(o1_);
+               b2.assertInstaceIsValid(o2_);
+               
+               
+               // Adapter Test
+               o1_ = Bindings.adaptUnchecked(o2, b2, b1);
+               o2_ = Bindings.adaptUnchecked(o1, b1, b2);
+               
+               assertEquals(0, b1.compare(o1, o1_));
+               assertEquals(0, b2.compare(o2, o2_));
+               assertTrue( b1.equals(o1, o1_) );               
+               assertTrue( b2.equals(o2, o2_) );                               
+               b1.assertInstaceIsValid(o1_);
+               b2.assertInstaceIsValid(o2_);
+               
+               // Binary Serializer Test
+               Serializer s1 = Bindings.getSerializer( b1 );
+               Serializer s2 = Bindings.getSerializer( b2 );
+               byte[] byte1 = s1.serialize(o1);
+               byte[] byte2 = s2.serialize(o2);
+               assertNotNull(byte1);
+               assertNotNull(byte2);
+               assertTrue( Arrays.equals(byte1, byte2) );
+               o1_ = s1.deserialize( byte2 );
+               o2_ = s2.deserialize( byte1 );
+
+               assertEquals(0, b1.compare(o1, o1_));
+               assertTrue( b1.equals(o1, o1_) );
+               assertEquals(0, b2.compare(o2, o2_));
+               assertTrue( b2.equals(o2, o2_) );
+                               
+               b1.assertInstaceIsValid(o1_);
+               b2.assertInstaceIsValid(o2_);
+                               
+               // Ascii Serializer Test
+               if (!OMIT_PARSER_TEST) {
+               String str1 = b1.printValueDefinition(o1, true);
+               String str2 = b2.printValueDefinition(o2, true);
+               assertEquals(str1, str2);
+               o1_ = b1.parseValueDefinition(str1);
+               o2_ = b2.parseValueDefinition(str2);            
+               assertEquals(0, b1.compare(o1, o1_));
+               assertEquals(0, b2.compare(o2, o2_));
+               assertTrue( b1.equals(o1, o1_) );
+               assertTrue( b2.equals(o2, o2_) );
+               b1.assertInstaceIsValid(o1_);
+               b2.assertInstaceIsValid(o2_);           
+               
+               str1 = b1.printValueDefinition(o1, false);
+               str2 = b2.printValueDefinition(o2, false);
+               o1_ = b1.parseValueDefinition(str1);
+               o2_ = b2.parseValueDefinition(str2);            
+               assertEquals(0, b1.compare(o1, o1_));
+               assertTrue( b1.equals(o1, o1_) );
+               assertEquals(0, b2.compare(o2, o2_));
+               assertTrue( b2.equals(o2, o2_) );
+               b1.assertInstaceIsValid(o1_);
+               b2.assertInstaceIsValid(o2_);
+               }
+
+       }       
+       
+       static void assert_not_same(Binding b1, Object o1, Binding b2, Object o2) throws BindingException, SerializationException, IOException, DataTypeSyntaxError, SerializerConstructionException
+       {
+               // DataType Test
+               assertEquals( b1.type(), b2.type() );
+               Datatype t = b1.type();
+               
+               // CompareTo Test
+               int dif = Integer.signum(  Bindings.compare(b1, o1, b2, o2)  );
+               int dif2 = Integer.signum(  Bindings.compare(b2, o2, b1, o1)  );
+               assertEquals(-dif2, dif);
+               
+               // Equals Test
+               assertFalse( Bindings.equals(b1, o1, b2, o2) );
+               
+               // HashCode Test (they could match by coincidence, we trust they don't)
+               int hash1 = b1.hashValue(o1);
+               int hash2 = b2.hashValue(o2);
+               assertNotSame( hash1, hash2 );          
+               
+               // Validator Test
+               b1.assertInstaceIsValid(o1);
+               b2.assertInstaceIsValid(o2);
+               
+               // Adapter Test
+               Object o1_ = Bindings.adaptUnchecked(o2, b2, b1);
+               Object o2_ = Bindings.adaptUnchecked(o1, b1, b2);
+               dif = Integer.signum(  Bindings.compare(b1, o1_, b2, o2_)  );
+               dif2 = Integer.signum(  Bindings.compare(b2, o2_, b1, o1_)  );
+               assertEquals(-dif2, dif);
+               assertFalse( b1.equals(o1, o1_) );              
+               assertFalse( b2.equals(o2, o2_) );              
+               b1.assertInstaceIsValid(o1_);
+               b2.assertInstaceIsValid(o2_);
+
+               // Binary Serializer Test
+               Serializer s1 = Bindings.getSerializer( b1 );
+               Serializer s2 = Bindings.getSerializer( b2 );
+               byte[] byte1 = s1.serialize(o1);
+               byte[] byte2 = s2.serialize(o2);
+               assertFalse( Arrays.equals(byte1, byte2) );
+               o1_ = s1.deserialize( byte2 );
+               o2_ = s2.deserialize( byte1 );
+               dif = Integer.signum(  Bindings.compare(b1, o1_, b2, o2_)  );
+               dif2 = Integer.signum(  Bindings.compare(b2, o2_, b1, o1_)  );
+               assertEquals(-dif2, dif);
+               dif = Integer.signum(  Bindings.compare(b1, o1, b1, o1_)  );
+               dif2 = Integer.signum(  Bindings.compare(b2, o2, b2, o2_)  );
+               assertEquals(-dif2, dif);
+               assertFalse( b1.equals(o1, o1_) );              
+               assertFalse( b2.equals(o2, o2_) );              
+               b1.assertInstaceIsValid(o1_);
+               b2.assertInstaceIsValid(o2_);\r
+\r
+               
+               
+               // Ascii Serializer Test
+               if (!OMIT_PARSER_TEST) {
+               String str1 = b1.printValueDefinition(o1, true);
+               String str2 = b2.printValueDefinition(o2, true);
+               assertNotSame(str1, str2);
+               o1_ = b1.parseValueDefinition(str2);
+               o2_ = b2.parseValueDefinition(str1);            
+               dif = Integer.signum(  Bindings.compare(b1, o1_, b2, o2_)  );
+               dif2 = Integer.signum(  Bindings.compare(b2, o2_, b1, o1_)  );
+               assertEquals(-dif2, dif);
+               dif = Integer.signum(  Bindings.compare(b1, o1, b1, o1_)  );
+               dif2 = Integer.signum(  Bindings.compare(b2, o2, b2, o2_)  );
+               assertEquals(-dif2, dif);
+               assertFalse( b1.equals(o1, o1_) );              
+               assertFalse( b2.equals(o2, o2_) );              
+               b1.assertInstaceIsValid(o1_);
+               b2.assertInstaceIsValid(o2_);
+               
+               str1 = b1.printValueDefinition(o1, false);
+               str2 = b2.printValueDefinition(o2, false);
+               assertNotSame(str1, str2);
+               o1_ = b1.parseValueDefinition(str2);
+               o2_ = b2.parseValueDefinition(str1);            
+               dif = Integer.signum(  Bindings.compare(b1, o1_, b2, o2_)  );
+               dif2 = Integer.signum(  Bindings.compare(b2, o2_, b1, o1_)  );
+               assertEquals(-dif2, dif);
+               dif = Integer.signum(  Bindings.compare(b1, o1, b1, o1_)  );
+               dif2 = Integer.signum(  Bindings.compare(b2, o2, b2, o2_)  );
+               assertEquals(-dif2, dif);
+               assertFalse( b1.equals(o1, o1_) );              
+               assertFalse( b2.equals(o2, o2_) );              
+               b1.assertInstaceIsValid(o1_);
+               b2.assertInstaceIsValid(o2_);   
+               }
+       }       
+       
+       static void assert_valid(Binding b, Object o) throws BindingException, IOException, SerializationException, DataTypeSyntaxError, SerializerConstructionException {
+               // Validator test
+               b.assertInstaceIsValid(o);
+               assertTrue( b.isInstance(o) );
+
+               // Serializer test
+               Serializer s = Bindings.getSerializer( b );
+               byte[] bytes = s.serialize(o);
+               
+               InputStream is = new ByteArrayInputStream(bytes);
+               s.skip(is);
+               assertEquals(0, is.available());
+               
+               is = new ByteArrayInputStream(bytes);
+               s.deserialize(is);
+               assertEquals(0, is.available());
+               
+               Object o_ = s.deserialize( bytes );
+               assertEquals(0, b.compare(o, o_));              
+               assertTrue( b.equals(o, o_) );\r
+               \r
+               // deserialize to instance Test\r
+               Binding gb = Bindings.getMutableBinding( b.type() );\r
+               o_ = gb.createDefault();\r
+               s = gb.serializer();\r
+               s.deserialize(bytes, o_);\r
+               assertTrue(Bindings.equals(b, o, gb, o_));\r
+               \r
+               // Read from test\r
+               o_ = gb.createDefault();\r
+               gb.readFrom(b, o, o_);\r
+               assertTrue(Bindings.equals(b, o, gb, o_));\r
+               \r
+               
+               // Ascii Serializer Test
+               if (!OMIT_PARSER_TEST) {
+               String str = b.printValueDefinition(o, true);
+               o_ = b.parseValueDefinition(str);
+               assertEquals(0, b.compare(o, o_));              
+               assertTrue( b.equals(o, o_) );
+               b.assertInstaceIsValid(o_);
+               assertTrue( b.isInstance(o_) );
+               }
+       }
+       
+       /**
+        * This case tests ordered map features getFirst, getLast, getLower, getFloor, getHigher, getCeiling 
+        * 
+        * @param valueBinding Map(Integer, String)
+        */
+       void test_ordered_map_binding(MapBinding b) throws Exception {
+               
+               Datatype keyType = b.type().keyType;
+               Datatype valueType = b.type().valueType;
+               
+               assertTrue(keyType instanceof IntegerType);
+               assertTrue(valueType instanceof StringType);
+               
+               IntegerBinding kb = (IntegerBinding) b.getKeyBinding();
+               
+               Object map = b.createDefault();
+               Object value = "";
+               b.put(map, kb.create(0), value);
+               b.put(map, kb.create(50), value);
+               b.put(map, kb.create(10), value);
+               b.put(map, kb.create(30), value);
+               b.put(map, kb.create(40), value);
+               b.put(map, kb.create(60), value);
+               b.put(map, kb.create(20), value);
+
+               assertEquals( b.getFirstKey(map), kb.create(0) );
+               assertEquals( b.getLastKey(map), kb.create(60) );
+
+               assertEquals( b.getFloorKey(map, kb.create(30)), kb.create(30));
+               assertEquals( b.getFloorKey(map, kb.create(29)), kb.create(20));
+               assertEquals( b.getFloorKey(map, kb.create(31)), kb.create(30));
+               assertEquals( b.getFloorKey(map, kb.create(70)), kb.create(60));
+               assertEquals( b.getFloorKey(map, kb.create(60)), kb.create(60));
+               assertEquals( b.getFloorKey(map, kb.create(61)), kb.create(60));
+               assertEquals( b.getFloorKey(map, kb.create(1)), kb.create(0));
+               assertEquals( b.getFloorKey(map, kb.create(0)), kb.create(0));
+               assertEquals( b.getFloorKey(map, kb.create(-1)), null);
+
+               assertEquals( b.getLowerKey(map, kb.create(30)), kb.create(20));
+               assertEquals( b.getLowerKey(map, kb.create(29)), kb.create(20));
+               assertEquals( b.getLowerKey(map, kb.create(31)), kb.create(30));
+               assertEquals( b.getLowerKey(map, kb.create(70)), kb.create(60));
+               assertEquals( b.getLowerKey(map, kb.create(60)), kb.create(50));
+               assertEquals( b.getLowerKey(map, kb.create(61)), kb.create(60));
+               assertEquals( b.getLowerKey(map, kb.create(1)), kb.create(0));
+               assertEquals( b.getLowerKey(map, kb.create(0)), null);
+               assertEquals( b.getLowerKey(map, kb.create(-1)), null);
+               
+               assertEquals( b.getCeilingKey(map, kb.create(30)), kb.create(30));
+               assertEquals( b.getCeilingKey(map, kb.create(29)), kb.create(30));
+               assertEquals( b.getCeilingKey(map, kb.create(31)), kb.create(40));
+               assertEquals( b.getCeilingKey(map, kb.create(-10)), kb.create(0));
+               assertEquals( b.getCeilingKey(map, kb.create(60)), kb.create(60));
+               assertEquals( b.getCeilingKey(map, kb.create(61)), null);
+
+               assertEquals( b.getHigherKey(map, kb.create(30)), kb.create(40));
+               assertEquals( b.getHigherKey(map, kb.create(29)), kb.create(30));
+               assertEquals( b.getHigherKey(map, kb.create(31)), kb.create(40));               
+               assertEquals( b.getHigherKey(map, kb.create(-10)), kb.create(0));
+               assertEquals( b.getHigherKey(map, kb.create(60)), null);
+               assertEquals( b.getHigherKey(map, kb.create(61)), null);
+               
+               
+       }
+
+}
+