#!/usr/bin/env python
#
# Copyright 2010 The Closure Library Authors. 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 test for source."""

__author__ = 'nnaze@google.com (Nathan Naze)'


import unittest

import source


class SourceTestCase(unittest.TestCase):
  """Unit test for source.  Tests the parser on a known source input."""

  def testSourceScan(self):
    test_source = source.Source(_TEST_SOURCE)

    self.assertEqual(set(['foo', 'foo.test']),
                     test_source.provides)
    self.assertEqual(set(['goog.dom', 'goog.events.EventType']),
                     test_source.requires)
    self.assertFalse(test_source.is_goog_module)

  def testSourceScanBase(self):
    test_source = source.Source(_TEST_BASE_SOURCE)

    self.assertEqual(set(['goog']),
                     test_source.provides)
    self.assertEqual(test_source.requires, set())
    self.assertFalse(test_source.is_goog_module)

  def testSourceScanBadBase(self):

    def MakeSource():
      source.Source(_TEST_BAD_BASE_SOURCE)

    self.assertRaises(Exception, MakeSource)

  def testSourceScanGoogModule(self):
    test_source = source.Source(_TEST_MODULE_SOURCE)

    self.assertEqual(set(['foo']),
                     test_source.provides)
    self.assertEqual(set(['bar']),
                     test_source.requires)
    self.assertTrue(test_source.is_goog_module)

  def testSourceScanModuleAlias(self):
    test_source = source.Source(_TEST_MODULE_ALIAS_SOURCE)

    self.assertEqual(set(['goog.dom', 'goog.events']), test_source.requires)
    self.assertTrue(test_source.is_goog_module)

  def testStripComments(self):
    self.assertEquals(
        '\nvar foo = function() {}',
        source.Source._StripComments((
            '/* This is\n'
            '  a comment split\n'
            '  over multiple lines\n'
            '*/\n'
            'var foo = function() {}')))

  def testGoogStatementsInComments(self):
    test_source = source.Source(_TEST_COMMENT_SOURCE)

    self.assertEqual(set(['foo']),
                     test_source.provides)
    self.assertEqual(set(['goog.events.EventType']),
                     test_source.requires)
    self.assertFalse(test_source.is_goog_module)

  def testHasProvideGoog(self):
    self.assertTrue(source.Source._HasProvideGoogFlag(_TEST_BASE_SOURCE))
    self.assertTrue(source.Source._HasProvideGoogFlag(_TEST_BAD_BASE_SOURCE))
    self.assertFalse(source.Source._HasProvideGoogFlag(_TEST_COMMENT_SOURCE))


_TEST_MODULE_ALIAS_SOURCE = """
goog.module('foo');
const {createDom: domCreator} = goog.require('goog.dom');
const {listen} = goog.require('goog.events');
"""


_TEST_MODULE_SOURCE = """
goog.module('foo');
var b = goog.require('bar');
"""


_TEST_SOURCE = """// Fake copyright notice

/** Very important comment. */

goog.provide('foo');
goog.provide('foo.test');

goog.require('goog.dom');
goog.require('goog.events.EventType');

function foo() {
  // Set bar to seventeen to increase performance.
  this.bar = 17;
}
"""

_TEST_COMMENT_SOURCE = """// Fake copyright notice

goog.provide('foo');

/*
goog.provide('foo.test');
 */

/*
goog.require('goog.dom');
*/

// goog.require('goog.dom');

goog.require('goog.events.EventType');

function bar() {
  this.baz = 55;
}
"""

_TEST_BASE_SOURCE = """
/**
 * @fileoverview The base file.
 * @provideGoog
 */

var goog = goog || {};
"""

_TEST_BAD_BASE_SOURCE = """
/**
 * @fileoverview The base file.
 * @provideGoog
 */

goog.provide('goog');
"""


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