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