blob: 788621801ea86d7d10f3e693f021f63ccfea1b22 [file] [log] [blame]
// Copyright 2016 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 "ui/gfx/win/text_analysis_source.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gfx/win/direct_write.h"
namespace mswr = Microsoft::WRL;
namespace gfx {
namespace win {
namespace {
DWRITE_READING_DIRECTION kReadingDirection =
DWRITE_READING_DIRECTION_TOP_TO_BOTTOM;
const wchar_t* kLocale = L"hi-in";
const wchar_t kText[] = L"sample text";
const size_t kTextLength = _countof(kText) - 1;
} // namespace
class TextAnalysisSourceTest : public testing::Test {
public:
TextAnalysisSourceTest() {
mswr::ComPtr<IDWriteFactory> factory;
CreateDWriteFactory(&factory);
mswr::ComPtr<IDWriteNumberSubstitution> number_substitution;
factory->CreateNumberSubstitution(DWRITE_NUMBER_SUBSTITUTION_METHOD_NONE,
kLocale, true /* ignoreUserOverride */,
&number_substitution);
TextAnalysisSource::Create(&source_, kText, kLocale,
number_substitution.Get(), kReadingDirection);
}
TextAnalysisSourceTest(const TextAnalysisSourceTest&) = delete;
TextAnalysisSourceTest& operator=(const TextAnalysisSourceTest&) = delete;
protected:
mswr::ComPtr<IDWriteTextAnalysisSource> source_;
};
TEST_F(TextAnalysisSourceTest, TestGetLocaleName) {
UINT32 length = 0;
const wchar_t* locale_name = nullptr;
HRESULT hr = E_FAIL;
hr = source_->GetLocaleName(0, &length, &locale_name);
EXPECT_TRUE(SUCCEEDED(hr));
EXPECT_EQ(kTextLength, length);
EXPECT_STREQ(kLocale, locale_name);
// Attempting to get a locale for a location that does not have a text chunk
// should fail.
hr = source_->GetLocaleName(kTextLength, &length, &locale_name);
EXPECT_TRUE(FAILED(hr));
}
TEST_F(TextAnalysisSourceTest, TestGetNumberSubstitution) {
UINT32 length = 0;
mswr::ComPtr<IDWriteNumberSubstitution> number_substitution;
HRESULT hr = E_FAIL;
hr = source_->GetNumberSubstitution(0, &length, &number_substitution);
EXPECT_TRUE(SUCCEEDED(hr));
EXPECT_EQ(kTextLength, length);
EXPECT_NE(nullptr, number_substitution.Get());
// Attempting to get a number substitution for a location that does not have
// a text chunk should fail.
hr = source_->GetNumberSubstitution(kTextLength, &length,
&number_substitution);
EXPECT_TRUE(FAILED(hr));
}
TEST_F(TextAnalysisSourceTest, TestGetParagraphReadingDirection) {
EXPECT_EQ(kReadingDirection, source_->GetParagraphReadingDirection());
}
TEST_F(TextAnalysisSourceTest, TestGetTextAtPosition) {
UINT32 length = 0;
const wchar_t* text = nullptr;
HRESULT hr = E_FAIL;
hr = source_->GetTextAtPosition(0, &text, &length);
EXPECT_TRUE(SUCCEEDED(hr));
EXPECT_EQ(kTextLength, length);
EXPECT_STREQ(kText, text);
hr = source_->GetTextAtPosition(5, &text, &length);
EXPECT_TRUE(SUCCEEDED(hr));
EXPECT_EQ(kTextLength - 5, length);
EXPECT_STREQ(kText + 5, text);
// Trying to get a text chunk past the end should return null.
hr = source_->GetTextAtPosition(kTextLength, &text, &length);
EXPECT_TRUE(SUCCEEDED(hr));
EXPECT_EQ(nullptr, text);
}
TEST_F(TextAnalysisSourceTest, TestGetTextBeforePosition) {
UINT32 length = 0;
const wchar_t* text = nullptr;
HRESULT hr = E_FAIL;
// Trying to get a text chunk before the beginning should return null.
hr = source_->GetTextBeforePosition(0, &text, &length);
EXPECT_TRUE(SUCCEEDED(hr));
EXPECT_EQ(nullptr, text);
hr = source_->GetTextBeforePosition(5, &text, &length);
EXPECT_TRUE(SUCCEEDED(hr));
EXPECT_EQ(5u, length);
EXPECT_STREQ(kText, text);
hr = source_->GetTextBeforePosition(kTextLength, &text, &length);
EXPECT_TRUE(SUCCEEDED(hr));
EXPECT_EQ(kTextLength, length);
EXPECT_STREQ(kText, text);
}
} // namespace win
} // namespace gfx