blob: 1b613106ef7b8d70aabf7e70d3cc245b51f17af1 [file] [log] [blame]
// Copyright 2015 The Cobalt Authors. 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/dom/dom_string_map.h"
#include <string>
#include "cobalt/dom/document.h"
#include "cobalt/dom/element.h"
#include "cobalt/dom/html_element_context.h"
#include "cobalt/script/testing/mock_exception_state.h"
#include "cobalt/script/testing/mock_property_enumerator.h"
#include "testing/gtest/include/gtest/gtest.h"
using testing::_;
using testing::StrictMock;
namespace cobalt {
namespace dom {
class DOMStringMapTest : public ::testing::Test {
protected:
DOMStringMapTest();
~DOMStringMapTest() override {}
HTMLElementContext html_element_context_;
scoped_refptr<Document> document_;
scoped_refptr<Element> element_;
scoped_refptr<DOMStringMap> dom_string_map_;
StrictMock<script::testing::MockExceptionState> exception_state_;
};
DOMStringMapTest::DOMStringMapTest()
: document_(new Document(&html_element_context_)),
element_(new Element(document_, base::Token("element"))),
dom_string_map_(new DOMStringMap(element_)) {}
TEST_F(DOMStringMapTest, InvalidPrefix) {
element_->SetAttribute("data", "Los Angeles");
StrictMock<script::testing::MockPropertyEnumerator> property_enumerator;
dom_string_map_->EnumerateNamedProperties(&property_enumerator);
EXPECT_FALSE(dom_string_map_->CanQueryNamedProperty(""));
dom_string_map_->AnonymousNamedSetter("", "San Francisco", &exception_state_);
EXPECT_EQ(std::string("Los Angeles"), element_->GetAttribute("data"));
}
TEST_F(DOMStringMapTest, Empty) {
element_->SetAttribute("data-", "Los Angeles");
StrictMock<script::testing::MockPropertyEnumerator> enumerator;
EXPECT_CALL(enumerator, AddProperty(""));
dom_string_map_->EnumerateNamedProperties(&enumerator);
EXPECT_TRUE(dom_string_map_->CanQueryNamedProperty(""));
EXPECT_EQ(std::string("Los Angeles"),
dom_string_map_->AnonymousNamedGetter("", &exception_state_));
dom_string_map_->AnonymousNamedSetter("", "San Francisco", &exception_state_);
EXPECT_EQ(std::string("San Francisco"), element_->GetAttribute("data-"));
}
TEST_F(DOMStringMapTest, OneWord) {
element_->SetAttribute("data-city", "Los Angeles");
StrictMock<script::testing::MockPropertyEnumerator> enumerator;
EXPECT_CALL(enumerator, AddProperty("city"));
dom_string_map_->EnumerateNamedProperties(&enumerator);
EXPECT_TRUE(dom_string_map_->CanQueryNamedProperty("city"));
EXPECT_EQ(std::string("Los Angeles"),
dom_string_map_->AnonymousNamedGetter("city", &exception_state_));
dom_string_map_->AnonymousNamedSetter("city", "San Francisco",
&exception_state_);
EXPECT_EQ(std::string("San Francisco"), element_->GetAttribute("data-city"));
}
TEST_F(DOMStringMapTest, MultipleWords) {
element_->SetAttribute("data-city-on-western-coast", "Los Angeles");
StrictMock<script::testing::MockPropertyEnumerator> enumerator;
EXPECT_CALL(enumerator, AddProperty("cityOnWesternCoast"));
dom_string_map_->EnumerateNamedProperties(&enumerator);
EXPECT_TRUE(dom_string_map_->CanQueryNamedProperty("cityOnWesternCoast"));
EXPECT_EQ(std::string("Los Angeles"),
dom_string_map_->AnonymousNamedGetter("cityOnWesternCoast",
&exception_state_));
dom_string_map_->AnonymousNamedSetter("cityOnWesternCoast", "San Francisco",
&exception_state_);
EXPECT_EQ(std::string("San Francisco"),
element_->GetAttribute("data-city-on-western-coast"));
}
TEST_F(DOMStringMapTest, ContainsNonLetterAfterHyphen) {
element_->SetAttribute("data-city-on-$western-coast", "Los Angeles");
StrictMock<script::testing::MockPropertyEnumerator> enumerator;
EXPECT_CALL(enumerator, AddProperty("cityOn-$westernCoast"));
dom_string_map_->EnumerateNamedProperties(&enumerator);
EXPECT_TRUE(dom_string_map_->CanQueryNamedProperty("cityOn-$westernCoast"));
EXPECT_EQ(std::string("Los Angeles"),
dom_string_map_->AnonymousNamedGetter("cityOn-$westernCoast",
&exception_state_));
dom_string_map_->AnonymousNamedSetter("cityOn-$westernCoast", "San Francisco",
&exception_state_);
EXPECT_EQ(std::string("San Francisco"),
element_->GetAttribute("data-city-on-$western-coast"));
}
TEST_F(DOMStringMapTest, EndsWithHyphen) {
element_->SetAttribute("data-city-", "Los Angeles");
StrictMock<script::testing::MockPropertyEnumerator> enumerator;
EXPECT_CALL(enumerator, AddProperty("city-"));
dom_string_map_->EnumerateNamedProperties(&enumerator);
EXPECT_TRUE(dom_string_map_->CanQueryNamedProperty("city-"));
EXPECT_EQ(std::string("Los Angeles"),
dom_string_map_->AnonymousNamedGetter("city-", &exception_state_));
dom_string_map_->AnonymousNamedSetter("city-", "San Francisco",
&exception_state_);
EXPECT_EQ(std::string("San Francisco"), element_->GetAttribute("data-city-"));
}
TEST_F(DOMStringMapTest, ContainsMultipleHyphens) {
element_->SetAttribute("data-california---city", "Los Angeles");
StrictMock<script::testing::MockPropertyEnumerator> enumerator;
EXPECT_CALL(enumerator, AddProperty("california--City"));
dom_string_map_->EnumerateNamedProperties(&enumerator);
EXPECT_TRUE(dom_string_map_->CanQueryNamedProperty("california--City"));
EXPECT_EQ(std::string("Los Angeles"),
dom_string_map_->AnonymousNamedGetter("california--City",
&exception_state_));
dom_string_map_->AnonymousNamedSetter("california--City", "San Francisco",
&exception_state_);
EXPECT_EQ(std::string("San Francisco"),
element_->GetAttribute("data-california---city"));
}
TEST_F(DOMStringMapTest, InvalidPropertyName) {
EXPECT_CALL(exception_state_,
SetSimpleExceptionVA(script::kSyntaxError, _, _));
dom_string_map_->AnonymousNamedSetter("hyphen-lowercase", "Los Angeles",
&exception_state_);
EXPECT_CALL(exception_state_,
SetSimpleExceptionVA(script::kSyntaxError, _, _));
dom_string_map_->AnonymousNamedGetter("hyphen-lowercase", &exception_state_);
}
} // namespace dom
} // namespace cobalt