blob: 48106ccf67bc2af7976304e563c5eb4ebf40de13 [file] [log] [blame]
/*
* Copyright 2015 Google Inc. 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.
*/
#include "cobalt/bindings/testing/arbitrary_interface.h"
#include "cobalt/bindings/testing/bindings_test_base.h"
#include "cobalt/bindings/testing/no_interface_object_interface.h"
#include "testing/gtest/include/gtest/gtest.h"
using ::testing::Return;
namespace cobalt {
namespace bindings {
namespace testing {
namespace {
typedef InterfaceBindingsTest<ArbitraryInterface> InterfaceObjectTest;
typedef InterfaceBindingsTest<NoInterfaceObjectInterface> NoInterfaceObjectTest;
} // namespace
// Spec for interface object: https://www.w3.org/TR/WebIDL/#interface-object
// Spec for interface prototype object:
// https://www.w3.org/TR/WebIDL/#interface-prototype-object
// Interface object for non-callback interface is a global property.
TEST_F(InterfaceObjectTest, InterfaceObjectIsGlobalProperty) {
std::string result;
EXPECT_TRUE(EvaluateScript(
"this.hasOwnProperty(\"ArbitraryInterface\");", &result));
EXPECT_STREQ("true", result.c_str());
}
// Interface object for non-callback interface is a function object.
TEST_F(InterfaceObjectTest, InterfaceObjectIsFunctionObject) {
std::string result;
EXPECT_TRUE(EvaluateScript(
"ArbitraryInterface instanceof Function;", &result));
EXPECT_STREQ("true", result.c_str());
}
// The value of the "prototype" property must be the
// 'interface prototype object'.
TEST_F(InterfaceObjectTest, PrototypePropertyIsSet) {
std::string result;
EXPECT_TRUE(EvaluateScript(
"ArbitraryInterface.hasOwnProperty(\"prototype\");", &result));
EXPECT_STREQ("true", result.c_str());
EXPECT_TRUE(EvaluateScript(
"ArbitraryInterface.prototype == Object.getPrototypeOf(test);",
&result));
EXPECT_STREQ("true", result.c_str());
}
// The value of the "name" property must be the identifier of the interface.
TEST_F(InterfaceObjectTest, NamePropertyIsSet) {
std::string result;
EXPECT_TRUE(EvaluateScript("ArbitraryInterface.name;", &result));
EXPECT_STREQ("ArbitraryInterface", result.c_str());
}
// The interface prototype object must have a property named "constructor" whose
// value is a reference the the interface object.
TEST_F(InterfaceObjectTest, ConstructorPropertyExists) {
std::string result;
EXPECT_TRUE(EvaluateScript("test.hasOwnProperty(\"constructor\");", &result));
EXPECT_STREQ("false", result.c_str());
EXPECT_TRUE(EvaluateScript(
"Object.getPrototypeOf(test).hasOwnProperty(\"constructor\");", &result));
EXPECT_STREQ("true", result.c_str());
}
// The interface prototype object must have a property named "constructor" whose
// value is a reference the the interface object.
TEST_F(InterfaceObjectTest, ConstructorPropertyIsInterfaceObject) {
std::string result;
EXPECT_TRUE(EvaluateScript(
"Object.getPrototypeOf(test).constructor === ArbitraryInterface;",
&result));
EXPECT_STREQ("true", result.c_str());
}
// If [NoInterfaceObject] extended attribute is specified, there should be no
// constructor property on the prototype.
TEST_F(NoInterfaceObjectTest, NoConstructorProperty) {
std::string result;
EXPECT_TRUE(EvaluateScript(
"Object.getPrototypeOf(test).hasOwnProperty(\"constructor\");", &result));
EXPECT_STREQ("false", result.c_str());
}
// Interface object for non-callback interface is a function object.
TEST_F(NoInterfaceObjectTest, NoInterfaceObjectGlobalProperty) {
std::string result;
EXPECT_TRUE(EvaluateScript(
"this.hasOwnProperty(\"NoInterfaceObjectInterface\");", &result));
EXPECT_STREQ("false", result.c_str());
}
} // namespace testing
} // namespace bindings
} // namespace cobalt