#!/usr/bin/env python
# Copyright (c) 2012 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import json_schema
import unittest

class JsonSchemaUnittest(unittest.TestCase):
  def testNocompile(self):
    compiled = [
      {
        "namespace": "compile",
        "description": "The compile API.",
        "functions": [],
        "types":     {}
      },

      {
        "namespace": "functions",
        "description": "The functions API.",
        "functions": [
          {
            "id": "two"
          },
          {
            "id": "four"
          }
        ],

        "types": {
          "one": { "key": "value" }
        }
      },

      {
        "namespace": "types",
        "description": "The types API.",
        "functions": [
          { "id": "one" }
        ],
        "types": {
          "two": {
            "key": "value"
          },
          "four": {
            "key": "value"
          }
        }
      },

      {
        "namespace": "nested",
        "description": "The nested API.",
        "properties": {
          "sync": {
            "functions": [
              {
                "id": "two"
              },
              {
                "id": "four"
              }
            ],
            "types": {
              "two": {
                "key": "value"
              },
              "four": {
                "key": "value"
              }
            }
          }
        }
      }
    ]

    schema = json_schema.CachedLoad('test/json_schema_test.json')
    self.assertEquals(compiled, json_schema.DeleteNodes(schema, 'nocompile'))

    def should_delete(value):
      return isinstance(value, dict) and not value.get('valid', True)
    expected = [
      {'one': {'test': 'test'}},
      {'valid': True},
      {}
    ]
    given = [
      {'one': {'test': 'test'}, 'two': {'valid': False}},
      {'valid': True},
      {},
      {'valid': False}
    ]
    self.assertEquals(
        expected, json_schema.DeleteNodes(given, matcher=should_delete))


if __name__ == '__main__':
  unittest.main()
