public void Serialization_CriterionDeserialize()
        {
            var criterion = Json.Deserialize <CriterionResponse>(criterionJson);

            Assert.Equal("cjb0ln006esruzz6gymu12c6f", criterion.Id);
            Assert.Equal("9hk14dln35", criterion.ApplicationId);
            Assert.Equal("criterion name", criterion.Name);
            Assert.Equal("criterion description", criterion.Description);
            Assert.Equal("key content", criterion.Key);

            Assert.Equal(CriterionEvaluationType.Standard, criterion.Evaluation.Type);
            Assert.Equal(CriterionOperator.GreaterOrEqual, criterion.Evaluation.Operator);
            Assert.Equal(5, criterion.Evaluation.Threshold);

            Assert.Equal(DateTimeOffset.Parse("2017-12-10T10:01:08.55"), criterion.Meta.Created.Value);

            // meta custom fields
            Assert.Equal("is the criterion working?", criterion.Meta.GetCustomField <string>("custom criterion"));
            Assert.Equal(198231, criterion.Meta.GetCustomField <int>("custom int field"));
            Assert.Equal("the criterion in our database", criterion.Meta.GetCustomField <JToken>("custom untyped object field")["criterion-db-description"].Value <string>());
            Assert.Equal("criterion working!", criterion.Meta.GetCustomField <JToken>("custom untyped object field")["object field"]["string field"]);

            SerializableTestPerson person = criterion.Meta.GetCustomField <SerializableTestPerson>("custom typed field");

            Assert.Equal("John Doe", person.Name);
            Assert.Equal(35, person.Age);
        }
        public void Serialization_AchievementDeserialize()
        {
            var achievement = Json.Deserialize <AchievementResponse>(AchievementJson);

            Assert.Equal("cj1sp5nse02j9zkruwhb3zwik", achievement.Id);
            Assert.Equal("y70ujss", achievement.ApplicationId);
            Assert.Equal("Anger Management", achievement.Name);
            Assert.Equal("Relentlessly punish inanimate objects", achievement.Description);

            // eval tree
            Assert.Equal("AND", achievement.EvalTree.Condition);
            Assert.Equal(new string[] { "cirjx77kw0004113jlb0h5l51" }, achievement.EvalTree.Criteria);
            Assert.Empty(achievement.EvalTree.Groups);

            // options
            Assert.True(achievement.Options.Suspended);

            // awards
            Assert.Equal(new string[] { "ciqjx77kw2684513jlb0p5l51" }, achievement.Awards);

            // meta
            Assert.Equal(System.DateTimeOffset.Parse("2016-08-07T01:18:19.061Z"), achievement.Meta.Created.Value);
            Assert.Equal("https://example.com/image", achievement.Meta.Icon);

            // meta custom fields
            Assert.Equal("my custom field string value", achievement.Meta.GetCustomField <string>("custom string field"));
            Assert.Equal(5, achievement.Meta.GetCustomField <int>("custom int field"));
            Assert.Equal("hello!", achievement.Meta.GetCustomField <JToken>("custom untyped object field")["string field"].Value <string>());
            Assert.Equal("hello again!", achievement.Meta.GetCustomField <JToken>("custom untyped object field")["object field"]["string field"]);

            SerializableTestPerson person = achievement.Meta.GetCustomField <SerializableTestPerson>("custom typed field");

            Assert.Equal("John Doe", person.Name);
            Assert.Equal(35, person.Age);
        }
        public void Serialization_AccountDeserialize()
        {
            var account = Json.Deserialize <AccountResponse>(accountJson);

            Assert.Equal("3eknqblf51", account.Id);
            Assert.Equal(@"Account name with sybmols !@#$%^&*()_+", account.Name);
            Assert.Equal("Account description content", account.Description);
            Assert.Equal(DateTimeOffset.Parse("2017-11-19T20:08:33.48"), account.Meta.Created.Value);

            // meta custom fields
            Assert.Equal("DAEA9D61-1297-41E2-9F14-E41B67C3EEF2", account.Meta.GetCustomField <string>("custom account id"));
            Assert.Equal(2384793, account.Meta.GetCustomField <int>("custom int field"));
            Assert.Equal("some account description", account.Meta.GetCustomField <JToken>("custom untyped object field")["string field"].Value <string>());
            Assert.Equal("an account", account.Meta.GetCustomField <JToken>("custom untyped object field")["object field"]["string field"]);

            SerializableTestPerson person = account.Meta.GetCustomField <SerializableTestPerson>("custom typed field");

            Assert.Equal("John Doe", person.Name);
            Assert.Equal(35, person.Age);
        }
        public void Serialization_ApplicationDeserialize()
        {
            var application = Json.Deserialize <ApplicationResponse>(applicationJson);

            Assert.Equal("9hk14dln35", application.Id);
            Assert.Equal("3eknqblf51", application.AccountId);
            Assert.Equal("vagabond volcano", application.Name);
            Assert.Equal("Application description content", application.Description);
            Assert.Equal(DateTimeOffset.Parse("2017-11-19T20:08:59.62"), application.Meta.Created.Value);

            // meta custom fields
            Assert.Equal("my app 1!2@3#4$5%", application.Meta.GetCustomField <string>("custom application string"));
            Assert.Equal(-982713, application.Meta.GetCustomField <int>("custom int field"));
            Assert.Equal("my application", application.Meta.GetCustomField <JToken>("custom untyped object field")["string field"].Value <string>());
            Assert.Equal(12903812, application.Meta.GetCustomField <JToken>("custom untyped object field")["object field"]["int field"]);

            SerializableTestPerson person = application.Meta.GetCustomField <SerializableTestPerson>("custom typed field");

            Assert.Equal("John Doe", person.Name);
            Assert.Equal(35, person.Age);
        }
        public void Serialization_AwardDeserialize()
        {
            var award = Json.Deserialize <AwardResponse>(awardJson);

            Assert.Equal("cj1syiekxnxrb6kovpsxglcdx", award.Id);
            Assert.Equal("y70ujss", award.ApplicationId);
            Assert.Equal("20 Gold", award.Name);
            Assert.Equal("20 Gold reward from the king!", award.Description);

            Assert.Equal(20, award.Data["gold"]);
            Assert.True((bool)award.Data["otherNestedData"]["bool"]);

            // meta custom fields
            Assert.Equal("DAEA9D61-1297-41E2-9F14-E41B67C3EEF2", award.Meta.GetCustomField <string>("custom award id in database"));
            Assert.Equal(5, award.Meta.GetCustomField <int>("custom int field"));
            Assert.Equal("the award name", award.Meta.GetCustomField <JToken>("custom untyped object field")["string field"].Value <string>());
            Assert.Equal("got an award!", award.Meta.GetCustomField <JToken>("custom untyped object field")["object field"]["string field"]);

            SerializableTestPerson person = award.Meta.GetCustomField <SerializableTestPerson>("custom typed field");

            Assert.Equal("John Doe", person.Name);
            Assert.Equal(35, person.Age);
        }