blob: 92e7e5a27cdc1092220ac9bdb780abbb143d2a05 [file] [log] [blame]
// 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.
#include "base/strings/stringprintf.h"
#include "extensions/renderer/module_system_test.h"
#include "grit/extensions_renderer_resources.h"
namespace extensions {
namespace {
class UtilsUnittest : public ModuleSystemTest {
protected:
void RegisterTestModule(const char* code) {
env()->RegisterModule("test",
base::StringPrintf(
"var assert = requireNative('assert');\n"
"var AssertTrue = assert.AssertTrue;\n"
"var AssertFalse = assert.AssertFalse;\n"
"var utils = require('utils');\n"
"%s",
code));
}
private:
virtual void SetUp() OVERRIDE {
ModuleSystemTest::SetUp();
env()->RegisterModule("utils", IDR_UTILS_JS);
env()->OverrideNativeHandler("schema_registry",
"exports.GetSchema = function() {};");
env()->OverrideNativeHandler("logging",
"exports.CHECK = function() {};\n"
"exports.WARNING = function() {};");
}
};
TEST_F(UtilsUnittest, TestNothing) {
ExpectNoAssertionsMade();
}
TEST_F(UtilsUnittest, SuperClass) {
ModuleSystem::NativesEnabledScope natives_enabled_scope(
env()->module_system());
RegisterTestModule(
"function SuperClassImpl() {}\n"
"\n"
"SuperClassImpl.prototype = {\n"
" attrA: 'aSuper',\n"
" attrB: 'bSuper',\n"
" func: function() { return 'func'; },\n"
" superFunc: function() { return 'superFunc'; }\n"
"};\n"
"\n"
"function SubClassImpl() {\n"
" SuperClassImpl.call(this);\n"
"}\n"
"\n"
"SubClassImpl.prototype = {\n"
" __proto__: SuperClassImpl.prototype,\n"
" attrA: 'aSub',\n"
" attrC: 'cSub',\n"
" func: function() { return 'overridden'; },\n"
" subFunc: function() { return 'subFunc'; }\n"
"};\n"
"\n"
"var SuperClass = utils.expose('SuperClass',\n"
" SuperClassImpl,\n"
" { functions: ['func', 'superFunc'],\n"
" properties: ['attrA', 'attrB'] });\n"
"\n"
"var SubClass = utils.expose('SubClass',\n"
" SubClassImpl,\n"
" { superclass: SuperClass,\n"
" functions: ['subFunc'],\n"
" properties: ['attrC'] });\n"
"\n"
"var supe = new SuperClass();\n"
"AssertTrue(supe.attrA == 'aSuper');\n"
"AssertTrue(supe.attrB == 'bSuper');\n"
"AssertFalse('attrC' in supe);\n"
"AssertTrue(supe.func() == 'func');\n"
"AssertTrue('superFunc' in supe);\n"
"AssertTrue(supe.superFunc() == 'superFunc');\n"
"AssertFalse('subFunc' in supe);\n"
"AssertTrue(supe instanceof SuperClass);\n"
"\n"
"var sub = new SubClass();\n"
"AssertTrue(sub.attrA == 'aSub');\n"
"AssertTrue(sub.attrB == 'bSuper');\n"
"AssertTrue(sub.attrC == 'cSub');\n"
"AssertTrue(sub.func() == 'overridden');\n"
"AssertTrue(sub.superFunc() == 'superFunc');\n"
"AssertTrue('subFunc' in sub);\n"
"AssertTrue(sub.subFunc() == 'subFunc');\n"
"AssertTrue(sub instanceof SuperClass);\n"
"AssertTrue(sub instanceof SubClass);\n"
"\n"
"function SubSubClassImpl() {}\n"
"SubSubClassImpl.prototype = Object.create(SubClassImpl.prototype);\n"
"SubSubClassImpl.prototype.subSubFunc = function() { return 'subsub'; }\n"
"\n"
"var SubSubClass = utils.expose('SubSubClass',\n"
" SubSubClassImpl,\n"
" { superclass: SubClass,\n"
" functions: ['subSubFunc'] });\n"
"var subsub = new SubSubClass();\n"
"AssertTrue(subsub.attrA == 'aSub');\n"
"AssertTrue(subsub.attrB == 'bSuper');\n"
"AssertTrue(subsub.attrC == 'cSub');\n"
"AssertTrue(subsub.func() == 'overridden');\n"
"AssertTrue(subsub.superFunc() == 'superFunc');\n"
"AssertTrue(subsub.subFunc() == 'subFunc');\n"
"AssertTrue(subsub.subSubFunc() == 'subsub');\n"
"AssertTrue(subsub instanceof SuperClass);\n"
"AssertTrue(subsub instanceof SubClass);\n"
"AssertTrue(subsub instanceof SubSubClass);\n");
env()->module_system()->Require("test");
}
} // namespace
} // namespace extensions