#!/usr/bin/env python
# Copyright 2016 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.

from cpp_bundle_generator import CppBundleGenerator
from model import Model

import json_schema
import os
import unittest

def _createCppBundleGenerator(file_path):
  json_object = json_schema.Load(file_path)
  model = Model()
  model.AddNamespace(json_object[0], file_path)
  cpp_bundle_generator = CppBundleGenerator(
      None, model, None, None, 'generated_api_schemas',
      None, None, None)
  return (cpp_bundle_generator, model)

def _getPlatformIfdefs(cpp_bundle_generator, model):
  return cpp_bundle_generator._GetPlatformIfdefs(
      model.namespaces.values()[0].functions.values()[0])

class CppBundleGeneratorTest(unittest.TestCase):
  def testIfDefsForWinLinux(self):
    cpp_bundle_generator, model = _createCppBundleGenerator(
        'test/function_platform_win_linux.json')
    self.assertEquals(
        'defined(OS_WIN) || (defined(OS_LINUX) && !defined(OS_CHROMEOS))',
        _getPlatformIfdefs(cpp_bundle_generator, model))

  def testIfDefsForAll(self):
    cpp_bundle_generator, model = _createCppBundleGenerator(
        'test/function_platform_all.json')
    self.assertEquals(
        'defined(OS_WIN) || (defined(OS_LINUX) && !defined(OS_CHROMEOS)) || '
        'defined(OS_CHROMEOS)',
        _getPlatformIfdefs(cpp_bundle_generator, model))

  def testIfDefsForChromeOS(self):
    cpp_bundle_generator, model = _createCppBundleGenerator(
        'test/function_platform_chromeos.json')
    self.assertEquals(
        'defined(OS_CHROMEOS)',
        _getPlatformIfdefs(cpp_bundle_generator, model))

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