13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "components/json_schema/json_schema_validator_unittest_base.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cfloat> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cmath> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <limits> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/base_paths.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/json/json_file_value_serializer.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "components/json_schema/json_schema_constants.h" 203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "components/json_schema/json_schema_validator.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace schema = json_schema_constants; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define TEST_SOURCE base::StringPrintf("%s:%i", __FILE__, __LINE__) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::Value* LoadValue(const std::string& filename) { 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath path; 303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) PathService::Get(base::DIR_SOURCE_ROOT, &path); 313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) path = path.AppendASCII("components") 323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) .AppendASCII("test") 333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) .AppendASCII("data") 343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) .AppendASCII("json_schema") 353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) .AppendASCII(filename); 367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_TRUE(base::PathExists(path)); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string error_message; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONFileValueSerializer serializer(path); 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value* result = serializer.Deserialize(NULL, &error_message); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE() << "Could not parse JSON: " << error_message; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::Value* LoadValue(const std::string& filename, base::Value::Type type) { 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value> result(LoadValue(filename)); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result.get()) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result->IsType(type)) { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ADD_FAILURE() << "Expected type " << type << ", got: " << result->GetType(); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result.release(); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::ListValue* LoadList(const std::string& filename) { 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return static_cast<base::ListValue*>( 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadValue(filename, base::Value::TYPE_LIST)); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::DictionaryValue* LoadDictionary(const std::string& filename) { 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return static_cast<base::DictionaryValue*>( 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadValue(filename, base::Value::TYPE_DICTIONARY)); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 70effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochJSONSchemaValidatorTestBase::JSONSchemaValidatorTestBase() { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void JSONSchemaValidatorTestBase::RunTests() { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestComplex(); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestStringPattern(); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestEnum(); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestChoices(); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestExtends(); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestObject(); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestTypeReference(); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestArrayTuple(); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestArrayNonTuple(); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestString(); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNumber(); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestTypeClassifier(); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestTypes(); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void JSONSchemaValidatorTestBase::TestComplex() { 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::DictionaryValue> schema( 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadDictionary("complex_schema.json")); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::ListValue> instance(LoadList("complex_instance.json")); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(schema.get()); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(instance.get()); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, instance.get(), schema.get(), NULL); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance->Remove(instance->GetSize() - 1, NULL); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, instance.get(), schema.get(), NULL); 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instance->Append(new base::DictionaryValue()); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectNotValid(TEST_SOURCE, instance.get(), schema.get(), NULL, "1", 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::FormatErrorMessage( 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::kInvalidType, 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema::kNumber, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema::kObject)); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance->Remove(instance->GetSize() - 1, NULL); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue* item = NULL; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(instance->GetDictionary(0, &item)); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item->SetString("url", "xxxxxxxxxxx"); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectNotValid(TEST_SOURCE, instance.get(), schema.get(), NULL, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "0.url", 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::FormatErrorMessage( 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::kStringMaxLength, "10")); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void JSONSchemaValidatorTestBase::TestStringPattern() { 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::DictionaryValue> schema(new base::DictionaryValue()); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->SetString(schema::kType, schema::kString); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->SetString(schema::kPattern, "foo+"); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>(new base::StringValue("foo")).get(), 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema.get(), NULL); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>(new base::StringValue("foooooo")).get(), 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema.get(), NULL); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectNotValid(TEST_SOURCE, 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>(new base::StringValue("bar")).get(), 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) schema.get(), 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::FormatErrorMessage( 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::kStringPattern, "foo+")); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void JSONSchemaValidatorTestBase::TestEnum() { 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::DictionaryValue> schema(LoadDictionary("enum_schema.json")); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>(new base::StringValue("foo")).get(), 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema.get(), NULL); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>(new base::FundamentalValue(42)).get(), 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema.get(), NULL); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>(new base::FundamentalValue(false)).get(), 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema.get(), NULL); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectNotValid(TEST_SOURCE, 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>(new base::StringValue("42")).get(), 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) schema.get(), 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) JSONSchemaValidator::kInvalidEnum); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectNotValid(TEST_SOURCE, 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>(base::Value::CreateNullValue()).get(), 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) schema.get(), 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) JSONSchemaValidator::kInvalidEnum); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void JSONSchemaValidatorTestBase::TestChoices() { 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::DictionaryValue> schema( 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadDictionary("choices_schema.json")); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>(base::Value::CreateNullValue()).get(), 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema.get(), NULL); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>(new base::FundamentalValue(42)).get(), 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema.get(), NULL); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::DictionaryValue> instance(new base::DictionaryValue()); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance->SetString("foo", "bar"); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, instance.get(), schema.get(), NULL); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectNotValid(TEST_SOURCE, 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>(new base::StringValue("foo")).get(), 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) schema.get(), 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) JSONSchemaValidator::kInvalidChoice); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectNotValid(TEST_SOURCE, 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>(new base::ListValue()).get(), 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) schema.get(), 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) JSONSchemaValidator::kInvalidChoice); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance->SetInteger("foo", 42); 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExpectNotValid(TEST_SOURCE, 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) instance.get(), 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) schema.get(), 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) JSONSchemaValidator::kInvalidChoice); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void JSONSchemaValidatorTestBase::TestExtends() { 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(aa): JS only 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void JSONSchemaValidatorTestBase::TestObject() { 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::DictionaryValue> schema(new base::DictionaryValue()); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->SetString(schema::kType, schema::kObject); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->SetString("properties.foo.type", schema::kString); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->SetString("properties.bar.type", schema::kInteger); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::DictionaryValue> instance(new base::DictionaryValue()); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance->SetString("foo", "foo"); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance->SetInteger("bar", 42); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, instance.get(), schema.get(), NULL); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance->SetBoolean("extra", true); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectNotValid(TEST_SOURCE, instance.get(), schema.get(), NULL, 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "extra", JSONSchemaValidator::kUnexpectedProperty); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance->Remove("extra", NULL); 222effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance->Remove("bar", NULL); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectNotValid(TEST_SOURCE, instance.get(), schema.get(), NULL, "bar", 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::kObjectPropertyIsRequired); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance->SetString("bar", "42"); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectNotValid(TEST_SOURCE, instance.get(), schema.get(), NULL, "bar", 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::FormatErrorMessage( 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::kInvalidType, 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema::kInteger, 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema::kString)); 233effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch instance->SetInteger("bar", 42); 234effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 235effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Test "patternProperties". 236effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch instance->SetInteger("extra", 42); 237effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ExpectNotValid(TEST_SOURCE, instance.get(), schema.get(), NULL, 238effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch "extra", JSONSchemaValidator::kUnexpectedProperty); 239effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch schema->SetString("patternProperties.extra+.type", 240effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch schema::kInteger); 241effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ExpectValid(TEST_SOURCE, instance.get(), schema.get(), NULL); 242effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch instance->Remove("extra", NULL); 243effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch instance->SetInteger("extraaa", 42); 244effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ExpectValid(TEST_SOURCE, instance.get(), schema.get(), NULL); 245effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch instance->Remove("extraaa", NULL); 246effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch instance->SetInteger("extr", 42); 247effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ExpectNotValid(TEST_SOURCE, instance.get(), schema.get(), NULL, 248effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch "extr", JSONSchemaValidator::kUnexpectedProperty); 249effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch instance->Remove("extr", NULL); 250effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch schema->Remove(schema::kPatternProperties, NULL); 251effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 252effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Test "patternProperties" and "properties" schemas are both checked if 253effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // applicable. 254effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch schema->SetString("patternProperties.fo+.type", schema::kInteger); 255effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ExpectNotValid(TEST_SOURCE, instance.get(), schema.get(), NULL, "foo", 256effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch JSONSchemaValidator::FormatErrorMessage( 257effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch JSONSchemaValidator::kInvalidType, 258effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch schema::kInteger, 259effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch schema::kString)); 260effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch instance->SetInteger("foo", 123); 261effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ExpectNotValid(TEST_SOURCE, instance.get(), schema.get(), NULL, "foo", 262effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch JSONSchemaValidator::FormatErrorMessage( 263effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch JSONSchemaValidator::kInvalidType, 264effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch schema::kString, 265effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch schema::kInteger)); 266effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch instance->SetString("foo", "foo"); 267effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch schema->Remove(schema::kPatternProperties, NULL); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 269effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Test additional properties. 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue* additional_properties = new base::DictionaryValue(); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) additional_properties->SetString(schema::kType, schema::kAny); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->Set(schema::kAdditionalProperties, additional_properties); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance->SetBoolean("extra", true); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, instance.get(), schema.get(), NULL); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance->SetString("extra", "foo"); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, instance.get(), schema.get(), NULL); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) additional_properties->SetString(schema::kType, schema::kBoolean); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance->SetBoolean("extra", true); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, instance.get(), schema.get(), NULL); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance->SetString("extra", "foo"); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectNotValid(TEST_SOURCE, instance.get(), schema.get(), NULL, 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "extra", JSONSchemaValidator::FormatErrorMessage( 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::kInvalidType, 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema::kBoolean, 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema::kString)); 290effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch instance->Remove("extra", NULL); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue* properties = NULL; 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue* bar_property = NULL; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(schema->GetDictionary(schema::kProperties, &properties)); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(properties->GetDictionary("bar", &bar_property)); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bar_property->SetBoolean(schema::kOptional, true); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, instance.get(), schema.get(), NULL); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance->Remove("bar", NULL); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, instance.get(), schema.get(), NULL); 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instance->Set("bar", base::Value::CreateNullValue()); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectNotValid(TEST_SOURCE, instance.get(), schema.get(), NULL, 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "bar", JSONSchemaValidator::FormatErrorMessage( 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::kInvalidType, 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema::kInteger, 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema::kNull)); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance->SetString("bar", "42"); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectNotValid(TEST_SOURCE, instance.get(), schema.get(), NULL, 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "bar", JSONSchemaValidator::FormatErrorMessage( 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::kInvalidType, 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema::kInteger, 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema::kString)); 313effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 314effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Verify that JSON parser handles dot in "patternProperties" well. 315effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch schema.reset(LoadDictionary("pattern_properties_dot.json")); 316effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ASSERT_TRUE(schema->GetDictionary(schema::kPatternProperties, &properties)); 317effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ASSERT_TRUE(properties->HasKey("^.$")); 318effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 319effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch instance.reset(new base::DictionaryValue()); 320effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch instance->SetString("a", "whatever"); 321effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ExpectValid(TEST_SOURCE, instance.get(), schema.get(), NULL); 322effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch instance->SetString("foo", "bar"); 323effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ExpectNotValid(TEST_SOURCE, instance.get(), schema.get(), NULL, 324effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch "foo", JSONSchemaValidator::kUnexpectedProperty); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void JSONSchemaValidatorTestBase::TestTypeReference() { 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::ListValue> types(LoadList("reference_types.json")); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(types.get()); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::DictionaryValue> schema(new base::DictionaryValue()); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->SetString(schema::kType, schema::kObject); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->SetString("properties.foo.type", schema::kString); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->SetString("properties.bar.$ref", "Max10Int"); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->SetString("properties.baz.$ref", "MinLengthString"); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::DictionaryValue> schema_inline(new base::DictionaryValue()); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema_inline->SetString(schema::kType, schema::kObject); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema_inline->SetString("properties.foo.type", schema::kString); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema_inline->SetString("properties.bar.id", "NegativeInt"); 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema_inline->SetString("properties.bar.type", schema::kInteger); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema_inline->SetInteger("properties.bar.maximum", 0); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema_inline->SetString("properties.baz.$ref", "NegativeInt"); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::DictionaryValue> instance(new base::DictionaryValue()); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance->SetString("foo", "foo"); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance->SetInteger("bar", 4); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance->SetString("baz", "ab"); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::DictionaryValue> instance_inline( 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new base::DictionaryValue()); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_inline->SetString("foo", "foo"); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_inline->SetInteger("bar", -4); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_inline->SetInteger("baz", -2); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, instance.get(), schema.get(), types.get()); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, instance_inline.get(), schema_inline.get(), NULL); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Validation failure, but successful schema reference. 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance->SetString("baz", "a"); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectNotValid(TEST_SOURCE, instance.get(), schema.get(), types.get(), 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "baz", JSONSchemaValidator::FormatErrorMessage( 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::kStringMinLength, "2")); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_inline->SetInteger("bar", 20); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectNotValid(TEST_SOURCE, instance_inline.get(), schema_inline.get(), NULL, 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "bar", JSONSchemaValidator::FormatErrorMessage( 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::kNumberMaximum, "0")); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove MinLengthString type. 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) types->Remove(types->GetSize() - 1, NULL); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance->SetString("baz", "ab"); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectNotValid(TEST_SOURCE, instance.get(), schema.get(), types.get(), 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "bar", JSONSchemaValidator::FormatErrorMessage( 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::kUnknownTypeReference, 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Max10Int")); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove internal type "NegativeInt". 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema_inline->Remove("properties.bar", NULL); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_inline->Remove("bar", NULL); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectNotValid(TEST_SOURCE, instance_inline.get(), schema_inline.get(), NULL, 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "baz", JSONSchemaValidator::FormatErrorMessage( 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::kUnknownTypeReference, 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "NegativeInt")); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void JSONSchemaValidatorTestBase::TestArrayTuple() { 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::DictionaryValue> schema( 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LoadDictionary("array_tuple_schema.json")); 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(schema.get()); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::ListValue> instance(new base::ListValue()); 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instance->Append(new base::StringValue("42")); 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instance->Append(new base::FundamentalValue(42)); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, instance.get(), schema.get(), NULL); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instance->Append(new base::StringValue("anything")); 399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExpectNotValid(TEST_SOURCE, 400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) instance.get(), 401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) schema.get(), 402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::FormatErrorMessage( 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::kArrayMaxItems, "2")); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance->Remove(1, NULL); 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance->Remove(1, NULL); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectNotValid(TEST_SOURCE, instance.get(), schema.get(), NULL, "1", 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::kArrayItemRequired); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instance->Set(0, new base::FundamentalValue(42)); 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instance->Append(new base::FundamentalValue(42)); 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectNotValid(TEST_SOURCE, instance.get(), schema.get(), NULL, "0", 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::FormatErrorMessage( 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::kInvalidType, 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema::kString, 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema::kInteger)); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue* additional_properties = new base::DictionaryValue(); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) additional_properties->SetString(schema::kType, schema::kAny); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->Set(schema::kAdditionalProperties, additional_properties); 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instance->Set(0, new base::StringValue("42")); 4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instance->Append(new base::StringValue("anything")); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, instance.get(), schema.get(), NULL); 4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instance->Set(2, new base::ListValue()); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, instance.get(), schema.get(), NULL); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) additional_properties->SetString(schema::kType, schema::kBoolean); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectNotValid(TEST_SOURCE, instance.get(), schema.get(), NULL, "2", 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::FormatErrorMessage( 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::kInvalidType, 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema::kBoolean, 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema::kArray)); 4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instance->Set(2, new base::FundamentalValue(false)); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, instance.get(), schema.get(), NULL); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ListValue* items_schema = NULL; 4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue* item0_schema = NULL; 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(schema->GetList(schema::kItems, &items_schema)); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(items_schema->GetDictionary(0, &item0_schema)); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) item0_schema->SetBoolean(schema::kOptional, true); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance->Remove(2, NULL); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, instance.get(), schema.get(), NULL); 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(aa): I think this is inconsistent with the handling of NULL+optional 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for objects. 4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instance->Set(0, base::Value::CreateNullValue()); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, instance.get(), schema.get(), NULL); 4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instance->Set(0, new base::FundamentalValue(42)); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectNotValid(TEST_SOURCE, instance.get(), schema.get(), NULL, "0", 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::FormatErrorMessage( 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::kInvalidType, 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema::kString, 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema::kInteger)); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void JSONSchemaValidatorTestBase::TestArrayNonTuple() { 4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::DictionaryValue> schema(new base::DictionaryValue()); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->SetString(schema::kType, schema::kArray); 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->SetString("items.type", schema::kString); 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->SetInteger(schema::kMinItems, 2); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->SetInteger(schema::kMaxItems, 3); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::ListValue> instance(new base::ListValue()); 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instance->Append(new base::StringValue("x")); 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instance->Append(new base::StringValue("x")); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, instance.get(), schema.get(), NULL); 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instance->Append(new base::StringValue("x")); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, instance.get(), schema.get(), NULL); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instance->Append(new base::StringValue("x")); 473c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExpectNotValid(TEST_SOURCE, 474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) instance.get(), 475c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) schema.get(), 476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::FormatErrorMessage( 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::kArrayMaxItems, "3")); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance->Remove(1, NULL); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance->Remove(1, NULL); 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance->Remove(1, NULL); 483c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExpectNotValid(TEST_SOURCE, 484c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) instance.get(), 485c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) schema.get(), 486c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::FormatErrorMessage( 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::kArrayMinItems, "2")); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance->Remove(1, NULL); 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) instance->Append(new base::FundamentalValue(42)); 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectNotValid(TEST_SOURCE, instance.get(), schema.get(), NULL, "1", 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::FormatErrorMessage( 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::kInvalidType, 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema::kString, 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema::kInteger)); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void JSONSchemaValidatorTestBase::TestString() { 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::DictionaryValue> schema(new base::DictionaryValue()); 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->SetString(schema::kType, schema::kString); 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->SetInteger(schema::kMinLength, 1); 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->SetInteger(schema::kMaxLength, 10); 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>(new base::StringValue("x")).get(), 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema.get(), NULL); 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>( 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new base::StringValue("xxxxxxxxxx")).get(), 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema.get(), NULL); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExpectNotValid( 515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TEST_SOURCE, 516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::Value>(new base::StringValue(std::string())).get(), 517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) schema.get(), 518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) JSONSchemaValidator::FormatErrorMessage( 521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) JSONSchemaValidator::kStringMinLength, "1")); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectNotValid( 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TEST_SOURCE, 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>(new base::StringValue("xxxxxxxxxxx")).get(), 525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) schema.get(), 526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::FormatErrorMessage( 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::kStringMaxLength, "10")); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void JSONSchemaValidatorTestBase::TestNumber() { 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::DictionaryValue> schema(new base::DictionaryValue()); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->SetString(schema::kType, schema::kNumber); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->SetInteger(schema::kMinimum, 1); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->SetInteger(schema::kMaximum, 100); 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->SetInteger("maxDecimal", 2); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>(new base::FundamentalValue(1)).get(), 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema.get(), NULL); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>(new base::FundamentalValue(50)).get(), 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema.get(), NULL); 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>(new base::FundamentalValue(100)).get(), 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema.get(), NULL); 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>(new base::FundamentalValue(88.88)).get(), 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema.get(), NULL); 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExpectNotValid(TEST_SOURCE, 553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::Value>(new base::FundamentalValue(0.5)).get(), 554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) schema.get(), 555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) JSONSchemaValidator::FormatErrorMessage( 558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) JSONSchemaValidator::kNumberMinimum, "1")); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectNotValid( 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TEST_SOURCE, 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>(new base::FundamentalValue(100.1)).get(), 562c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) schema.get(), 563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::FormatErrorMessage( 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::kNumberMaximum, "100")); 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void JSONSchemaValidatorTestBase::TestTypeClassifier() { 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(schema::kBoolean), 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::GetJSONSchemaType( 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>( 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new base::FundamentalValue(true)).get())); 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(schema::kBoolean), 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::GetJSONSchemaType( 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>( 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new base::FundamentalValue(false)).get())); 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It doesn't matter whether the C++ type is 'integer' or 'real'. If the 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // number is integral and within the representable range of integers in 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // double, it's classified as 'integer'. 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(schema::kInteger), 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::GetJSONSchemaType( 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>(new base::FundamentalValue(42)).get())); 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(schema::kInteger), 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::GetJSONSchemaType( 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>(new base::FundamentalValue(0)).get())); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(schema::kInteger), 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::GetJSONSchemaType( 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>(new base::FundamentalValue(42)).get())); 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(schema::kInteger), 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) JSONSchemaValidator::GetJSONSchemaType(scoped_ptr<base::Value>( 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new base::FundamentalValue(pow(2.0, DBL_MANT_DIG))).get())); 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(schema::kInteger), 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) JSONSchemaValidator::GetJSONSchemaType(scoped_ptr<base::Value>( 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new base::FundamentalValue(pow(-2.0, DBL_MANT_DIG))).get())); 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // "number" is only used for non-integral numbers, or numbers beyond what 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // double can accurately represent. 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(schema::kNumber), 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::GetJSONSchemaType( 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>( 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new base::FundamentalValue(88.8)).get())); 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(schema::kNumber), 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) JSONSchemaValidator::GetJSONSchemaType(scoped_ptr<base::Value>( 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new base::FundamentalValue(pow(2.0, DBL_MANT_DIG) * 2)).get())); 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(schema::kNumber), 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) JSONSchemaValidator::GetJSONSchemaType(scoped_ptr<base::Value>( 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new base::FundamentalValue( 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pow(-2.0, DBL_MANT_DIG) * 2)).get())); 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(schema::kString), 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::GetJSONSchemaType( 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>(new base::StringValue("foo")).get())); 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(schema::kArray), 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::GetJSONSchemaType( 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>(new base::ListValue()).get())); 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(schema::kObject), 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::GetJSONSchemaType( 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>(new base::DictionaryValue()).get())); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(schema::kNull), 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) JSONSchemaValidator::GetJSONSchemaType( 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>(base::Value::CreateNullValue()).get())); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void JSONSchemaValidatorTestBase::TestTypes() { 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::DictionaryValue> schema(new base::DictionaryValue()); 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // valid 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->SetString(schema::kType, schema::kObject); 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExpectValid(TEST_SOURCE, 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>(new base::DictionaryValue()).get(), 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema.get(), NULL); 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->SetString(schema::kType, schema::kArray); 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExpectValid(TEST_SOURCE, scoped_ptr<base::Value>(new base::ListValue()).get(), 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema.get(), NULL); 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->SetString(schema::kType, schema::kString); 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>(new base::StringValue("foobar")).get(), 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema.get(), NULL); 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->SetString(schema::kType, schema::kNumber); 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>(new base::FundamentalValue(88.8)).get(), 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema.get(), NULL); 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>(new base::FundamentalValue(42)).get(), 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema.get(), NULL); 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>(new base::FundamentalValue(42)).get(), 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema.get(), NULL); 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>(new base::FundamentalValue(0)).get(), 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema.get(), NULL); 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->SetString(schema::kType, schema::kInteger); 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>(new base::FundamentalValue(42)).get(), 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema.get(), NULL); 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>(new base::FundamentalValue(42)).get(), 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema.get(), NULL); 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>(new base::FundamentalValue(0)).get(), 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema.get(), NULL); 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>( 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new base::FundamentalValue(pow(2.0, DBL_MANT_DIG))).get(), 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema.get(), NULL); 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>( 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new base::FundamentalValue(pow(-2.0, DBL_MANT_DIG))).get(), 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema.get(), NULL); 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->SetString(schema::kType, schema::kBoolean); 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>(new base::FundamentalValue(false)).get(), 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema.get(), NULL); 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>(new base::FundamentalValue(true)).get(), 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema.get(), NULL); 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->SetString(schema::kType, schema::kNull); 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpectValid(TEST_SOURCE, 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<base::Value>(base::Value::CreateNullValue()).get(), 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema.get(), NULL); 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // not valid 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->SetString(schema::kType, schema::kObject); 692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExpectNotValid( 693c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TEST_SOURCE, 694c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::Value>(new base::ListValue()).get(), 695c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) schema.get(), 696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 698c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) JSONSchemaValidator::FormatErrorMessage( 699c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) JSONSchemaValidator::kInvalidType, schema::kObject, schema::kArray)); 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->SetString(schema::kType, schema::kObject); 702c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExpectNotValid( 703c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TEST_SOURCE, 704c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::Value>(base::Value::CreateNullValue()).get(), 705c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) schema.get(), 706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 708c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) JSONSchemaValidator::FormatErrorMessage( 709c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) JSONSchemaValidator::kInvalidType, schema::kObject, schema::kNull)); 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->SetString(schema::kType, schema::kArray); 712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExpectNotValid( 713c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TEST_SOURCE, 714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::Value>(new base::FundamentalValue(42)).get(), 715c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) schema.get(), 716c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 718c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) JSONSchemaValidator::FormatErrorMessage( 719c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) JSONSchemaValidator::kInvalidType, schema::kArray, schema::kInteger)); 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->SetString(schema::kType, schema::kString); 722c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExpectNotValid( 723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TEST_SOURCE, 724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::Value>(new base::FundamentalValue(42)).get(), 725c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) schema.get(), 726c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) JSONSchemaValidator::FormatErrorMessage(JSONSchemaValidator::kInvalidType, 729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) schema::kString, 730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) schema::kInteger)); 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->SetString(schema::kType, schema::kNumber); 733c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExpectNotValid( 734c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TEST_SOURCE, 735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::Value>(new base::StringValue("42")).get(), 736c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) schema.get(), 737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) JSONSchemaValidator::FormatErrorMessage( 740c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) JSONSchemaValidator::kInvalidType, schema::kNumber, schema::kString)); 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->SetString(schema::kType, schema::kInteger); 743c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExpectNotValid( 744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TEST_SOURCE, 745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::Value>(new base::FundamentalValue(88.8)).get(), 746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) schema.get(), 747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 748c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 749c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) JSONSchemaValidator::kInvalidTypeIntegerNumber); 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->SetString(schema::kType, schema::kBoolean); 752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExpectNotValid( 753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TEST_SOURCE, 754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::Value>(new base::FundamentalValue(1)).get(), 755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) schema.get(), 756c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 757c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 758c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) JSONSchemaValidator::FormatErrorMessage(JSONSchemaValidator::kInvalidType, 759c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) schema::kBoolean, 760c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) schema::kInteger)); 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) schema->SetString(schema::kType, schema::kNull); 763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExpectNotValid( 764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TEST_SOURCE, 765c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<base::Value>(new base::FundamentalValue(false)).get(), 766c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) schema.get(), 767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), 769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) JSONSchemaValidator::FormatErrorMessage( 770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) JSONSchemaValidator::kInvalidType, schema::kNull, schema::kBoolean)); 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 772