|  | #!/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. | 
|  | expected_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. */ | 
|  |  | 
|  | assertNotReached('Interface file for Closure Compiler should not be executed.'); | 
|  |  | 
|  | /** @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: assertNotReached, | 
|  |  | 
|  | /** | 
|  | * @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: assertNotReached, | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * 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( | 
|  | expected_output, | 
|  | JsInterfaceGenerator().Generate(namespace).Render()) | 
|  |  | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | unittest.main() |