public void ShouldDeserializeDocComplexExample()
        {
            string recordString = 
                "name:\"ORole\"," + 
                "id:0," +
                "defaultClusterId:3," +
                "clusterIds:[3]," +
                "properties:[" +
                    "(name:\"mode\",type:17,offset:0,mandatory:false,notNull:false,min:,max:,linkedClass:,linkedType:,index:)," +
                    "(name:\"rules\",type:12,offset:1,mandatory:false,notNull:false,min:,max:,linkedClass:,linkedType:17,index:)" +
                "]";

            ORecord record = new ORecord(recordString);

            // check for fields existence
            Assert.AreEqual(record.HasField("name"), true);
            Assert.AreEqual(record.HasField("id"), true);
            Assert.AreEqual(record.HasField("defaultClusterId"), true);
            Assert.AreEqual(record.HasField("clusterIds"), true);
            Assert.AreEqual(record.HasField("properties"), true);

            // check for fields values
            Assert.AreEqual(record.GetField<string>("name"), "ORole");
            Assert.AreEqual(record.GetField<int>("id"), 0);
            Assert.AreEqual(record.GetField<int>("defaultClusterId"), 3);
            Assert.AreEqual(record.GetField<List<int>>("clusterIds").Count, 1);
            Assert.AreEqual(record.GetField<List<int>>("clusterIds")[0], 3);

            List<DocComplexExampleEmbedded> loadedProperties = record.GetField<List<DocComplexExampleEmbedded>>("properties");
            List<DocComplexExampleEmbedded> properties = new List<DocComplexExampleEmbedded>();
            properties.Add(new DocComplexExampleEmbedded() { name = "mode", type = 17, offset = 0, mandatory = false, notNull = false, min = null, max = null, linkedClass = null, linkedType = null, index = null });
            properties.Add(new DocComplexExampleEmbedded() { name = "rules", type = 12, offset = 1, mandatory = false, notNull = false, min = null, max = null, linkedClass = null, linkedType = 17, index = null });

            Assert.AreEqual(loadedProperties.Count, properties.Count);

            for (int i = 0; i < loadedProperties.Count; i++)
            {
                Assert.AreEqual(loadedProperties[i].name, properties[i].name);
                Assert.AreEqual(loadedProperties[i].type, properties[i].type);
                Assert.AreEqual(loadedProperties[i].offset, properties[i].offset);
                Assert.AreEqual(loadedProperties[i].mandatory, properties[i].mandatory);
                Assert.AreEqual(loadedProperties[i].notNull, properties[i].notNull);
                Assert.AreEqual(loadedProperties[i].min, properties[i].min);
                Assert.AreEqual(loadedProperties[i].max, properties[i].max);
                Assert.AreEqual(loadedProperties[i].linkedClass, properties[i].linkedClass);
                Assert.AreEqual(loadedProperties[i].linkedType, properties[i].linkedType);
                Assert.AreEqual(loadedProperties[i].index, properties[i].index);
            }
        }
        public void ShouldDeserializeDocSimpleExample()
        {
            string recordString = "Profile@nick:\"ThePresident\",follows:[],followers:[#10:5,#10:6],name:\"Barack\",surname:\"Obama\",location:#3:2,invitedBy:,salary_cloned:,salary:120.3f";

            ORecord record = new ORecord(recordString);

            Assert.AreEqual(record.ClassName, "Profile");

            // check for fields existence
            Assert.AreEqual(record.HasField("nick"), true);
            Assert.AreEqual(record.HasField("follows"), true);
            Assert.AreEqual(record.HasField("followers"), true);
            Assert.AreEqual(record.HasField("name"), true);
            Assert.AreEqual(record.HasField("surname"), true);
            Assert.AreEqual(record.HasField("location"), true);
            Assert.AreEqual(record.HasField("invitedBy"), true);
            Assert.AreEqual(record.HasField("salary_cloned"), true);
            Assert.AreEqual(record.HasField("salary"), true);

            // check for fields values
            Assert.AreEqual(record.GetField<string>("nick"), "ThePresident");

            Assert.AreEqual(record.GetField<List<object>>("follows").Count, new List<object>().Count);


            List<ORID> recordFollowers = record.GetField<List<ORID>>("followers");
            List<ORID> followers = new List<ORID> { new ORID("#10:5"), new ORID("#10:6") };

            Assert.AreEqual(recordFollowers.Count, followers.Count);
            Assert.AreEqual(recordFollowers[0], followers[0]);
            Assert.AreEqual(recordFollowers[1], followers[1]);
            
            Assert.AreEqual(record.GetField<string>("name"), "Barack");
            Assert.AreEqual(record.GetField<string>("surname"), "Obama");
            Assert.AreEqual(record.GetField<ORID>("location"), new ORID("#3:2"));
            Assert.AreEqual(record.GetField<string>("invitedBy"), null);
            Assert.AreEqual(record.GetField<string>("salary_cloned"), null);
            Assert.AreEqual(record.GetField<float>("salary"), 120.3f);
        }
        public void ShouldDeserializeSingleAndCollectionOfOrids()
        {
            string recordString = "single:#10:12345,collection:[#11:123,#22:1234,#33:1234567]";

            ORecord record = new ORecord(recordString);

            // check for fields existence
            Assert.AreEqual(record.HasField("single"), true);
            Assert.AreEqual(record.HasField("collection"), true);

            // check for fields values
            Assert.AreEqual(record.GetField<ORID>("single"), new ORID(10, 12345));
            List<ORID> collection = record.GetField<List<ORID>>("collection");
            Assert.AreEqual(collection.Count, 3);
            Assert.AreEqual(collection[0], new ORID(11, 123));
            Assert.AreEqual(collection[1], new ORID(22, 1234));
            Assert.AreEqual(collection[2], new ORID(33, 1234567));
        }
        public void ShouldDeserializeComplexEmbeddedrecordsArray()
        {
            string recordString = "array:[(zak1:(nick:[(joe1:\"js1\"),(joe2:\"js2\"),(joe3:\"js3\")])),(zak2:(nick:[(joe4:\"js4\"),(joe5:\"js5\"),(joe6:\"js6\")]))]";

            ORecord record = new ORecord(recordString);

            // check for fields existence
            Assert.AreEqual(record.HasField("array"), true);

            // check for fields values
            List<ODocument> arrayOfZaks = record.GetField<List<ODocument>>("array");
            Assert.AreEqual(arrayOfZaks.Count, 2);

            List<ODocument> arrayOfJoes1 = arrayOfZaks[0].GetField<List<ODocument>>("zak1.nick");
            Assert.AreEqual(arrayOfJoes1.Count, 3);
            Assert.AreEqual(arrayOfJoes1[0].GetField<string>("joe1"), "js1");
            Assert.AreEqual(arrayOfJoes1[1].GetField<string>("joe2"), "js2");
            Assert.AreEqual(arrayOfJoes1[2].GetField<string>("joe3"), "js3");

            List<ODocument> arrayOfJoes2 = arrayOfZaks[1].GetField<List<ODocument>>("zak2.nick");
            Assert.AreEqual(arrayOfJoes2.Count, 3);
            Assert.AreEqual(arrayOfJoes2[0].GetField<string>("joe4"), "js4");
            Assert.AreEqual(arrayOfJoes2[1].GetField<string>("joe5"), "js5");
            Assert.AreEqual(arrayOfJoes2[2].GetField<string>("joe6"), "js6");
        }
        public void ShouldDeserializeSimpleEmbeddedrecordsArray()
        {
            string recordString = "array:[(joe1:\"js1\"),(joe2:\"js2\"),(joe3:\"js3\")]";

            ORecord record = new ORecord(recordString);

            // check for fields existence
            Assert.AreEqual(record.HasField("array"), true);

            // check for fields values
            List<ODocument> array = record.GetField<List<ODocument>>("array");
            Assert.AreEqual(array.Count, 3);
            Assert.AreEqual(array[0].GetField<string>("joe1"), "js1");
            Assert.AreEqual(array[1].GetField<string>("joe2"), "js2");
            Assert.AreEqual(array[2].GetField<string>("joe3"), "js3");
        }
        public void ShouldDeserializeString()
        {
            string recordString = "simple:\"whoa this is awesome\",singleQuoted:\"a" + "\\" + "\"\",doubleQuoted:\"" + "\\" + "\"adsf" + "\\" + "\"\",twoBackslashes:\"" + "\\a" + "\\a" + "\"";

            ORecord record = new ORecord(recordString);

            // check for fields existence
            Assert.AreEqual(record.HasField("simple"), true);
            Assert.AreEqual(record.HasField("singleQuoted"), true);
            Assert.AreEqual(record.HasField("doubleQuoted"), true);
            Assert.AreEqual(record.HasField("twoBackslashes"), true);

            // check for fields values
            Assert.AreEqual(record.GetField<string>("simple"), "whoa this is awesome");
            Assert.AreEqual(record.GetField<string>("singleQuoted"), "a\"");
            Assert.AreEqual(record.GetField<string>("doubleQuoted"), "\"adsf\"");
            Assert.AreEqual(record.GetField<string>("twoBackslashes"), "\\a\\a");
        }
        public void ShouldDeserializeNumbers()
        {
            string recordString = "byte:123b,short:23456s,int:1543345,long:13243432455l,float:1234.432f,double:123123.4324d,bigdecimal:300.5c,embedded:(byte:123b,short:23456s,int:1543345,long:13243432455l,float:1234.432f,double:123123.4324d,bigdecimal:300.5c),array:[123b,23456s,1543345,13243432455l,1234.432f,123123.4324d,300.5c]";

            ORecord record = new ORecord(recordString);

            // check for fields existence
            Assert.AreEqual(record.HasField("byte"), true);
            Assert.AreEqual(record.HasField("short"), true);
            Assert.AreEqual(record.HasField("int"), true);
            Assert.AreEqual(record.HasField("long"), true);
            Assert.AreEqual(record.HasField("float"), true);
            Assert.AreEqual(record.HasField("double"), true);
            Assert.AreEqual(record.HasField("bigdecimal"), true);
            Assert.AreEqual(record.HasField("embedded.byte"), true);
            Assert.AreEqual(record.HasField("embedded.short"), true);
            Assert.AreEqual(record.HasField("embedded.int"), true);
            Assert.AreEqual(record.HasField("embedded.long"), true);
            Assert.AreEqual(record.HasField("embedded.float"), true);
            Assert.AreEqual(record.HasField("embedded.double"), true);
            Assert.AreEqual(record.HasField("embedded.bigdecimal"), true);
            Assert.AreEqual(record.HasField("array"), true);

            // check for fields values
            Assert.AreEqual(record.GetField<byte>("byte"), (byte)123);
            Assert.AreEqual(record.GetField<short>("short"), (short)23456);
            Assert.AreEqual(record.GetField<int>("int"), 1543345);
            Assert.AreEqual(record.GetField<long>("long"), 13243432455);
            Assert.AreEqual(record.GetField<float>("float"), 1234.432f);
            Assert.AreEqual(record.GetField<double>("double"), 123123.4324);
            Assert.AreEqual(record.GetField<decimal>("bigdecimal"), 300.5m);
            Assert.AreEqual(record.GetField<byte>("embedded.byte"), (byte)123);
            Assert.AreEqual(record.GetField<short>("embedded.short"), (short)23456);
            Assert.AreEqual(record.GetField<int>("embedded.int"), 1543345);
            Assert.AreEqual(record.GetField<long>("embedded.long"), 13243432455);
            Assert.AreEqual(record.GetField<float>("embedded.float"), 1234.432f);
            Assert.AreEqual(record.GetField<double>("embedded.double"), 123123.4324);
            Assert.AreEqual(record.GetField<decimal>("embedded.bigdecimal"), 300.5m);

            List<object> array = record.GetField<List<object>>("array");
            Assert.AreEqual(array.Count, 7);
            Assert.AreEqual(array[0], (byte)123);
            Assert.AreEqual(array[1], (short)23456);
            Assert.AreEqual(array[2], 1543345);
            Assert.AreEqual(array[3], 13243432455);
            Assert.AreEqual(array[4], 1234.432f);
            Assert.AreEqual(array[5], 123123.4324);
            Assert.AreEqual(array[6], 300.5m);
        }
        public void ShouldDeserializeNull()
        {
            string recordString = "nick:,embedded:(nick:,joe:),joe:";

            ORecord record = new ORecord(recordString);

            // check for fields existence
            Assert.AreEqual(record.HasField("nick"), true);
            Assert.AreEqual(record.HasField("embedded.nick"), true);
            Assert.AreEqual(record.HasField("embedded.joe"), true);
            Assert.AreEqual(record.HasField("joe"), true);

            // check for fields values
            Assert.AreEqual(record.GetField<string>("nick"), null);
            Assert.AreEqual(record.GetField<string>("embedded.nick"), null);
            Assert.AreEqual(record.GetField<string>("embedded.joe"), null);
            Assert.AreEqual(record.GetField<string>("joe"), null);
        }
        public void ShouldDeserializeBoolean()
        {
            string recordString = "singleT:true,singleF:false,embedded:(singleT:true,singleF:false),array:[true,false]";

            ORecord record = new ORecord(recordString);

            // check for fields existence
            Assert.AreEqual(record.HasField("singleT"), true);
            Assert.AreEqual(record.HasField("singleF"), true);
            Assert.AreEqual(record.HasField("embedded.singleT"), true);
            Assert.AreEqual(record.HasField("embedded.singleF"), true);
            Assert.AreEqual(record.HasField("array"), true);

            // check for fields values
            Assert.AreEqual(record.GetField<bool>("singleT"), true);
            Assert.AreEqual(record.GetField<bool>("singleF"), false);
            Assert.AreEqual(record.GetField<bool>("embedded.singleT"), true);
            Assert.AreEqual(record.GetField<bool>("embedded.singleF"), false);
            
            List<bool> array = record.GetField<List<bool>>("array");
            Assert.AreEqual(array.Count, 2);
            Assert.AreEqual(array[0], true);
            Assert.AreEqual(array[1], false);
        }
        public void ShouldDeserializeDateTime()
        {
            string recordString = "datetime:1296279468000t,date:1306281600000a,embedded:(datetime:1296279468000t,date:1306281600000a),array:[1296279468000t,1306281600000a]";

            ORecord record = new ORecord(recordString);

            // check for fields existence
            Assert.AreEqual(record.HasField("datetime"), true);
            Assert.AreEqual(record.HasField("date"), true);
            Assert.AreEqual(record.HasField("embedded.datetime"), true);
            Assert.AreEqual(record.HasField("embedded.date"), true);
            Assert.AreEqual(record.HasField("array"), true);

            // check for fields values
            Assert.AreEqual(record.GetField<DateTime>("datetime"), new DateTime(2011, 1, 29, 5, 37, 48));
            Assert.AreEqual(record.GetField<DateTime>("date"), new DateTime(2011, 5, 25, 0, 0, 0));
            Assert.AreEqual(record.GetField<DateTime>("embedded.datetime"), new DateTime(2011, 1, 29, 5, 37, 48));
            Assert.AreEqual(record.GetField<DateTime>("embedded.date"), new DateTime(2011, 5, 25, 0, 0, 0));

            List<DateTime> array = record.GetField<List<DateTime>>("array");
            Assert.AreEqual(array.Count, 2);
            Assert.AreEqual(array[0], new DateTime(2011, 1, 29, 5, 37, 48));
            Assert.AreEqual(array[1], new DateTime(2011, 5, 25, 0, 0, 0));
        }
        public void ShouldDeserializeDocBinary()
        {
            string recordString = "single:_AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGx_,embedded:(binary:_AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGx_),array:[_AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGx_,_AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGx_]";

            ORecord record = new ORecord(recordString);

            // check for fields existence
            Assert.AreEqual(record.HasField("single"), true);
            Assert.AreEqual(record.HasField("embedded"), true);
            Assert.AreEqual(record.HasField("embedded.binary"), true);
            Assert.AreEqual(record.HasField("array"), true);

            // check for fields values
            Assert.AreEqual(record.GetField<byte[]>("single").GetType(), typeof(byte[]));
            Assert.AreEqual(record.GetField<byte[]>("embedded.binary").GetType(), typeof(byte[]));

            List<byte[]> array = record.GetField<List<byte[]>>("array");
            Assert.AreEqual(array.Count, 2);
            Assert.AreEqual(array[0].GetType(), typeof(byte[]));
            Assert.AreEqual(array[0].GetType(), typeof(byte[]));
        }