blob: ec0ccf03f005e55343682d23989b12e45dfd3778 [file] [log] [blame]
// 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.
#include "third_party/blink/renderer/platform/fonts/small_caps_iterator.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace blink {
struct SmallCapsTestRun {
const char* const text;
SmallCapsIterator::SmallCapsBehavior code;
};
struct SmallCapsExpectedRun {
unsigned limit;
SmallCapsIterator::SmallCapsBehavior small_caps_behavior;
SmallCapsExpectedRun(
unsigned the_limit,
SmallCapsIterator::SmallCapsBehavior the_small_caps_behavior)
: limit(the_limit), small_caps_behavior(the_small_caps_behavior) {}
};
class SmallCapsIteratorTest : public testing::Test {
protected:
void CheckRuns(const Vector<SmallCapsTestRun>& runs) {
String text(g_empty_string16_bit);
Vector<SmallCapsExpectedRun> expect;
for (auto& run : runs) {
text.append(String::FromUTF8(run.text));
expect.push_back(SmallCapsExpectedRun(text.length(), run.code));
}
SmallCapsIterator small_caps_iterator(text.Characters16(), text.length());
VerifyRuns(&small_caps_iterator, expect);
}
void VerifyRuns(SmallCapsIterator* small_caps_iterator,
const Vector<SmallCapsExpectedRun>& expect) {
unsigned limit;
SmallCapsIterator::SmallCapsBehavior small_caps_behavior;
size_t run_count = 0;
while (small_caps_iterator->Consume(&limit, &small_caps_behavior)) {
ASSERT_LT(run_count, expect.size());
ASSERT_EQ(expect[run_count].limit, limit);
ASSERT_EQ(expect[run_count].small_caps_behavior, small_caps_behavior);
++run_count;
}
ASSERT_EQ(expect.size(), run_count);
}
};
// Some of our compilers cannot initialize a vector from an array yet.
#define DECLARE_SMALL_CAPS_RUNSVECTOR(...) \
static const SmallCapsTestRun kRunsArray[] = __VA_ARGS__; \
Vector<SmallCapsTestRun> runs; \
runs.Append(kRunsArray, sizeof(kRunsArray) / sizeof(*kRunsArray));
#define CHECK_SMALL_CAPS_RUN(...) \
DECLARE_SMALL_CAPS_RUNSVECTOR(__VA_ARGS__); \
CheckRuns(runs);
TEST_F(SmallCapsIteratorTest, Empty) {
String empty(g_empty_string16_bit);
SmallCapsIterator small_caps_iterator(empty.Characters16(), empty.length());
unsigned limit = 0;
SmallCapsIterator::SmallCapsBehavior small_caps_behavior =
SmallCapsIterator::kSmallCapsInvalid;
DCHECK(!small_caps_iterator.Consume(&limit, &small_caps_behavior));
ASSERT_EQ(limit, 0u);
ASSERT_EQ(small_caps_behavior, SmallCapsIterator::kSmallCapsInvalid);
}
TEST_F(SmallCapsIteratorTest, UppercaseA) {
CHECK_SMALL_CAPS_RUN({{"A", SmallCapsIterator::kSmallCapsSameCase}});
}
TEST_F(SmallCapsIteratorTest, LowercaseA) {
CHECK_SMALL_CAPS_RUN({{"a", SmallCapsIterator::kSmallCapsUppercaseNeeded}});
}
TEST_F(SmallCapsIteratorTest, UppercaseLowercaseA) {
CHECK_SMALL_CAPS_RUN({{"A", SmallCapsIterator::kSmallCapsSameCase},
{"a", SmallCapsIterator::kSmallCapsUppercaseNeeded}});
}
TEST_F(SmallCapsIteratorTest, UppercasePunctuationMixed) {
CHECK_SMALL_CAPS_RUN({{"AAA??", SmallCapsIterator::kSmallCapsSameCase}});
}
TEST_F(SmallCapsIteratorTest, LowercasePunctuationMixed) {
CHECK_SMALL_CAPS_RUN({{"aaa", SmallCapsIterator::kSmallCapsUppercaseNeeded},
{"===", SmallCapsIterator::kSmallCapsSameCase}});
}
TEST_F(SmallCapsIteratorTest, LowercasePunctuationInterleaved) {
CHECK_SMALL_CAPS_RUN({{"aaa", SmallCapsIterator::kSmallCapsUppercaseNeeded},
{"===", SmallCapsIterator::kSmallCapsSameCase},
{"bbb", SmallCapsIterator::kSmallCapsUppercaseNeeded}});
}
TEST_F(SmallCapsIteratorTest, Japanese) {
CHECK_SMALL_CAPS_RUN({{"ほへと", SmallCapsIterator::kSmallCapsSameCase}});
}
TEST_F(SmallCapsIteratorTest, Armenian) {
CHECK_SMALL_CAPS_RUN({{"աբգդ", SmallCapsIterator::kSmallCapsUppercaseNeeded},
{"ԵԶԷԸ", SmallCapsIterator::kSmallCapsSameCase}});
}
TEST_F(SmallCapsIteratorTest, CombiningCharacterSequence) {
CHECK_SMALL_CAPS_RUN({{"èü", SmallCapsIterator::kSmallCapsUppercaseNeeded}});
}
} // namespace blink