# Copyright 2014 Google Inc. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Unit tests for googleapiclient.schema."""
from __future__ import absolute_import

__author__ = 'jcgregorio@google.com (Joe Gregorio)'

import json
import os
import unittest2 as unittest

from googleapiclient.schema import Schemas


DATA_DIR = os.path.join(os.path.dirname(__file__), 'data')


def datafile(filename):
  return os.path.join(DATA_DIR, filename)

LOAD_FEED = """{
    "items": [
      {
        "longVal": 42,
        "kind": "zoo#loadValue",
        "enumVal": "A String",
        "anyVal": "", # Anything will do.
        "nullVal": None,
        "stringVal": "A String",
        "doubleVal": 3.14,
        "booleanVal": True or False, # True or False.
      },
    ],
    "kind": "zoo#loadFeed",
  }"""

class SchemasTest(unittest.TestCase):
  def setUp(self):
    f = open(datafile('zoo.json'))
    discovery = f.read()
    f.close()
    discovery = json.loads(discovery)
    self.sc = Schemas(discovery)

  def test_basic_formatting(self):
    self.assertEqual(sorted(LOAD_FEED.splitlines()),
                     sorted(self.sc.prettyPrintByName('LoadFeed').splitlines()))

  def test_empty_edge_case(self):
    self.assertTrue('Unknown type' in self.sc.prettyPrintSchema({}))

  def test_simple_object(self):
    self.assertEqual({}, eval(self.sc.prettyPrintSchema({'type': 'object'})))

  def test_string(self):
    self.assertEqual(type(""), type(eval(self.sc.prettyPrintSchema({'type':
      'string'}))))

  def test_integer(self):
    self.assertEqual(type(20), type(eval(self.sc.prettyPrintSchema({'type':
      'integer'}))))

  def test_number(self):
    self.assertEqual(type(1.2), type(eval(self.sc.prettyPrintSchema({'type':
      'number'}))))

  def test_boolean(self):
    self.assertEqual(type(True), type(eval(self.sc.prettyPrintSchema({'type':
      'boolean'}))))

  def test_string_default(self):
    self.assertEqual('foo', eval(self.sc.prettyPrintSchema({'type':
      'string', 'default': 'foo'})))

  def test_integer_default(self):
    self.assertEqual(20, eval(self.sc.prettyPrintSchema({'type':
      'integer', 'default': 20})))

  def test_number_default(self):
    self.assertEqual(1.2, eval(self.sc.prettyPrintSchema({'type':
      'number', 'default': 1.2})))

  def test_boolean_default(self):
    self.assertEqual(False, eval(self.sc.prettyPrintSchema({'type':
      'boolean', 'default': False})))

  def test_null(self):
    self.assertEqual(None, eval(self.sc.prettyPrintSchema({'type': 'null'})))

  def test_any(self):
    self.assertEqual('', eval(self.sc.prettyPrintSchema({'type': 'any'})))

  def test_array(self):
    self.assertEqual([{}], eval(self.sc.prettyPrintSchema({'type': 'array',
      'items': {'type': 'object'}})))

  def test_nested_references(self):
    feed = {
        'items': [ {
            'photo': {
              'hash': 'A String',
              'hashAlgorithm': 'A String',
              'filename': 'A String',
              'type': 'A String',
              'size': 42
              },
            'kind': 'zoo#animal',
            'etag': 'A String',
            'name': 'A String'
          }
        ],
        'kind': 'zoo#animalFeed',
        'etag': 'A String'
      }

    self.assertEqual(feed, eval(self.sc.prettyPrintByName('AnimalFeed')))

  def test_additional_properties(self):
    items = {
        'animals': {
          'a_key': {
            'photo': {
              'hash': 'A String',
              'hashAlgorithm': 'A String',
              'filename': 'A String',
              'type': 'A String',
              'size': 42
              },
            'kind': 'zoo#animal',
            'etag': 'A String',
            'name': 'A String'
          }
        },
        'kind': 'zoo#animalMap',
        'etag': 'A String'
      }

    self.assertEqual(items, eval(self.sc.prettyPrintByName('AnimalMap')))

  def test_unknown_name(self):
    self.assertRaises(KeyError,
        self.sc.prettyPrintByName, 'UknownSchemaThing')


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