#!/usr/bin/env python
# Copyright 2015 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 idl_schema
import json_parse
from js_interface_generator import JsInterfaceGenerator
from datetime import datetime
import model
import sys
import unittest

# The contents of a fake idl file.
fake_idl = """
// Copyright 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.

// A totally fake API.
namespace fakeApi {
  enum Greek {
    ALPHA,
    BETA,
    GAMMA,
    DELTA
  };

  dictionary Bar {
    long num;
  };

  dictionary Baz {
    DOMString str;
    long num;
    boolean b;
    Greek letter;
    Greek? optionalLetter;
    long[] arr;
    Bar[]? optionalObjArr;
    Greek[] enumArr;
    any[] anythingGoes;
    Bar obj;
    long? maybe;
    (DOMString or Greek or long[]) choice;
    object plainObj;
  };

  callback VoidCallback = void();

  callback BazGreekCallback = void(Baz baz, Greek greek);

  interface Functions {
    // Does something exciting! And what's more, this is a multiline function
    // comment! It goes onto multiple lines!
    // |baz| : The baz to use.
    static void doSomething(Baz baz, VoidCallback callback);

    // |callback| : The callback which will most assuredly in all cases be
    // called; that is, of course, iff such a callback was provided and is
    // not at all null.
    static void bazGreek(optional BazGreekCallback callback);

    [deprecated="Use a new method."] static DOMString returnString();
  };

  interface Events {
    // Fired when we realize it's a trap!
    static void onTrapDetected(Baz baz);
  };
};
"""

# The output we expect from our fake idl file.
fake_idl_output = ("""// Copyright %s 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.

// This file was generated by:
//   %s.

/** @fileoverview Interface for fakeApi that can be overriden. */

/** @interface */
function FakeApi() {}

FakeApi.prototype = {
  /**
   * Does something exciting! And what's more, this is a multiline function
   * comment! It goes onto multiple lines!
   * @param {!chrome.fakeApi.Baz} baz The baz to use.
   * @param {function(): void} callback
   * @see https://developer.chrome.com/extensions/fakeApi#method-doSomething
   */
  doSomething: function(baz, callback) {},

  /**
   * @param {function(!chrome.fakeApi.Baz, !chrome.fakeApi.Greek): void=}
   *     callback The callback which will most assuredly in all cases be called;
   *     that is, of course, iff such a callback was provided and is not at all
   *     null.
   * @see https://developer.chrome.com/extensions/fakeApi#method-bazGreek
   */
  bazGreek: function(callback) {},
};

/**
 * Fired when we realize it's a trap!
 * @type {!ChromeEvent}
 * @see https://developer.chrome.com/extensions/fakeApi#event-onTrapDetected
 */
FakeApi.prototype.onTrapDetected;""" % (datetime.now().year, sys.argv[0]))

class JsExternGeneratorTest(unittest.TestCase):
  def _GetNamespace(self, fake_content, filename):
    """Returns a namespace object for the given content"""
    api_def = idl_schema.Process(fake_content, filename)
    m = model.Model()
    return m.AddNamespace(api_def[0], filename)

  def setUp(self):
    self.maxDiff = None # Lets us see the full diff when inequal.

  def testBasic(self):
    namespace = self._GetNamespace(fake_idl, 'fake_api.idl')
    self.assertMultiLineEqual(
        fake_idl_output,
        JsInterfaceGenerator().Generate(namespace).Render())


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