# Copyright (c) 2014 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 unittest
import StringIO

from tvcm import generate
from tvcm import fake_fs
from tvcm import project as project_module
from tvcm import resource_loader

class GenerateTests(unittest.TestCase):
  def setUp(self):
    self.fs = fake_fs.FakeFS()
    self.fs.AddFile('/x/foo/my_module.html', """
<!DOCTYPE html>
<link rel="import" href="/foo/other_module.html">
""")
    self.fs.AddFile('/x/foo/other_module.html', """
<!DOCTYPE html>
<script src="/foo/raw/raw_script.js"></script>
<script>
    'use strict';
    HelloWorld();
</script>
""")
    self.fs.AddFile('/x/foo/raw/raw_script.js', """
/* raw script */
""")
    self.fs.AddFile('/x/components/polymer/polymer.min.js', """
""")

    self.project = project_module.Project(
        ['/x'])

  def testJSGeneration(self):
    with self.fs:
      load_sequence = self.project.CalcLoadSequenceForModuleFilenames(
          ['foo/my_module.html'])
      res = generate.GenerateJS(load_sequence)

  def testHTMLGeneration(self):
    with self.fs:
      load_sequence = self.project.CalcLoadSequenceForModuleFilenames(
          ['foo/my_module.html'])
      res = generate.GenerateStandaloneHTMLAsString(load_sequence, 'Title')
      assert 'HelloWorld();' in res


  def testExtraScriptWithWriteContentsFunc(self):
    with self.fs:
      load_sequence = self.project.CalcLoadSequenceForModuleFilenames(
          ['foo/my_module.html'])

      class ExtraScript(generate.ExtraScript):
        def WriteToFile(self, f):
          f.write('<script>ExtraScript!</script>')

      res = generate.GenerateStandaloneHTMLAsString(
          load_sequence, 'Title', extra_scripts=[ExtraScript()])
      assert 'ExtraScript' in res
