forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			162 lines
		
	
	
	
		
			6.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			162 lines
		
	
	
	
		
			6.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/* This Source Code Form is subject to the terms of the Mozilla Public
 | 
						|
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 | 
						|
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | 
						|
#include "gtest/gtest.h"
 | 
						|
 | 
						|
#include "mozilla/intl/ListFormat.h"
 | 
						|
#include "mozilla/Span.h"
 | 
						|
#include "TestBuffer.h"
 | 
						|
 | 
						|
namespace mozilla::intl {
 | 
						|
 | 
						|
// Test ListFormat.format with default options.
 | 
						|
TEST(IntlListFormat, FormatDefault)
 | 
						|
{
 | 
						|
  ListFormat::Options options;
 | 
						|
  UniquePtr<ListFormat> lf =
 | 
						|
      ListFormat::TryCreate(MakeStringSpan("en-US"), options).unwrap();
 | 
						|
  ListFormat::StringList list;
 | 
						|
  MOZ_RELEASE_ASSERT(list.append(MakeStringSpan(u"Alice")));
 | 
						|
  MOZ_RELEASE_ASSERT(list.append(MakeStringSpan(u"Bob")));
 | 
						|
  MOZ_RELEASE_ASSERT(list.append(MakeStringSpan(u"Charlie")));
 | 
						|
  TestBuffer<char16_t> buf16;
 | 
						|
  ASSERT_TRUE(lf->Format(list, buf16).isOk());
 | 
						|
  ASSERT_EQ(buf16.get_string_view(), u"Alice, Bob, and Charlie");
 | 
						|
 | 
						|
  UniquePtr<ListFormat> lfDe =
 | 
						|
      ListFormat::TryCreate(MakeStringSpan("de"), options).unwrap();
 | 
						|
  ASSERT_TRUE(lfDe->Format(list, buf16).isOk());
 | 
						|
  ASSERT_EQ(buf16.get_string_view(), u"Alice, Bob und Charlie");
 | 
						|
}
 | 
						|
 | 
						|
// Test ListFormat.format with Type::Conjunction and other styles.
 | 
						|
TEST(IntlListFormat, FormatConjunction)
 | 
						|
{
 | 
						|
  ListFormat::Options options{ListFormat::Type::Conjunction,
 | 
						|
                              ListFormat::Style::Narrow};
 | 
						|
  UniquePtr<ListFormat> lf =
 | 
						|
      ListFormat::TryCreate(MakeStringSpan("en-US"), options).unwrap();
 | 
						|
  ListFormat::StringList list;
 | 
						|
  MOZ_RELEASE_ASSERT(list.append(MakeStringSpan(u"Alice")));
 | 
						|
  MOZ_RELEASE_ASSERT(list.append(MakeStringSpan(u"Bob")));
 | 
						|
  MOZ_RELEASE_ASSERT(list.append(MakeStringSpan(u"Charlie")));
 | 
						|
  TestBuffer<char16_t> buf16;
 | 
						|
  ASSERT_TRUE(lf->Format(list, buf16).isOk());
 | 
						|
  ASSERT_EQ(buf16.get_string_view(), u"Alice, Bob, Charlie");
 | 
						|
 | 
						|
  ListFormat::Options optionsSh{ListFormat::Type::Conjunction,
 | 
						|
                                ListFormat::Style::Short};
 | 
						|
  UniquePtr<ListFormat> lfSh =
 | 
						|
      ListFormat::TryCreate(MakeStringSpan("en-US"), optionsSh).unwrap();
 | 
						|
  ASSERT_TRUE(lfSh->Format(list, buf16).isOk());
 | 
						|
  ASSERT_EQ(buf16.get_string_view(), u"Alice, Bob, & Charlie");
 | 
						|
}
 | 
						|
 | 
						|
// Test ListFormat.format with Type::Disjunction.
 | 
						|
TEST(IntlListFormat, FormatDisjunction)
 | 
						|
{
 | 
						|
  // When Type is Disjunction, the results will be the same regardless of the
 | 
						|
  // style for most locales, so simply test with Style::Long.
 | 
						|
  ListFormat::Options options{ListFormat::Type::Disjunction,
 | 
						|
                              ListFormat::Style::Long};
 | 
						|
  UniquePtr<ListFormat> lf =
 | 
						|
      ListFormat::TryCreate(MakeStringSpan("en-US"), options).unwrap();
 | 
						|
  ListFormat::StringList list;
 | 
						|
  MOZ_RELEASE_ASSERT(list.append(MakeStringSpan(u"Alice")));
 | 
						|
  MOZ_RELEASE_ASSERT(list.append(MakeStringSpan(u"Bob")));
 | 
						|
  MOZ_RELEASE_ASSERT(list.append(MakeStringSpan(u"Charlie")));
 | 
						|
  TestBuffer<char16_t> buf16;
 | 
						|
  ASSERT_TRUE(lf->Format(list, buf16).isOk());
 | 
						|
  ASSERT_EQ(buf16.get_string_view(), u"Alice, Bob, or Charlie");
 | 
						|
}
 | 
						|
 | 
						|
// Test ListFormat.format with Type::Unit.
 | 
						|
TEST(IntlListFormat, FormatUnit)
 | 
						|
{
 | 
						|
  ListFormat::Options options{ListFormat::Type::Unit, ListFormat::Style::Long};
 | 
						|
  // For locale "en", Style::Long and Style::Short have the same result, so just
 | 
						|
  // test Style::Long here.
 | 
						|
  UniquePtr<ListFormat> lf =
 | 
						|
      ListFormat::TryCreate(MakeStringSpan("en-US"), options).unwrap();
 | 
						|
  ListFormat::StringList list;
 | 
						|
  MOZ_RELEASE_ASSERT(list.append(MakeStringSpan(u"Alice")));
 | 
						|
  MOZ_RELEASE_ASSERT(list.append(MakeStringSpan(u"Bob")));
 | 
						|
  MOZ_RELEASE_ASSERT(list.append(MakeStringSpan(u"Charlie")));
 | 
						|
  TestBuffer<char16_t> buf16;
 | 
						|
  ASSERT_TRUE(lf->Format(list, buf16).isOk());
 | 
						|
  ASSERT_EQ(buf16.get_string_view(), u"Alice, Bob, Charlie");
 | 
						|
 | 
						|
  ListFormat::Options optionsNa{ListFormat::Type::Unit,
 | 
						|
                                ListFormat::Style::Narrow};
 | 
						|
  UniquePtr<ListFormat> lfNa =
 | 
						|
      ListFormat::TryCreate(MakeStringSpan("en-US"), optionsNa).unwrap();
 | 
						|
  ASSERT_TRUE(lfNa->Format(list, buf16).isOk());
 | 
						|
  ASSERT_EQ(buf16.get_string_view(), u"Alice Bob Charlie");
 | 
						|
}
 | 
						|
 | 
						|
// Pass a long list (list.length() > DEFAULT_LIST_LENGTH) and check the result
 | 
						|
// is still correct. (result.length > INITIAL_CHAR_BUFFER_SIZE)
 | 
						|
TEST(IntlListFormat, FormatBufferLength)
 | 
						|
{
 | 
						|
  ListFormat::Options options;
 | 
						|
  UniquePtr<ListFormat> lf =
 | 
						|
      ListFormat::TryCreate(MakeStringSpan("en-US"), options).unwrap();
 | 
						|
  ListFormat::StringList list;
 | 
						|
  MOZ_RELEASE_ASSERT(list.append(MakeStringSpan(u"Alice")));
 | 
						|
  MOZ_RELEASE_ASSERT(list.append(MakeStringSpan(u"Bob")));
 | 
						|
  MOZ_RELEASE_ASSERT(list.append(MakeStringSpan(u"Charlie")));
 | 
						|
  MOZ_RELEASE_ASSERT(list.append(MakeStringSpan(u"David")));
 | 
						|
  MOZ_RELEASE_ASSERT(list.append(MakeStringSpan(u"Eve")));
 | 
						|
  MOZ_RELEASE_ASSERT(list.append(MakeStringSpan(u"Frank")));
 | 
						|
  MOZ_RELEASE_ASSERT(list.append(MakeStringSpan(u"Grace")));
 | 
						|
  MOZ_RELEASE_ASSERT(list.append(MakeStringSpan(u"Heidi")));
 | 
						|
  MOZ_RELEASE_ASSERT(list.append(MakeStringSpan(u"Ivan")));
 | 
						|
  TestBuffer<char16_t> buf16;
 | 
						|
  ASSERT_TRUE(lf->Format(list, buf16).isOk());
 | 
						|
  ASSERT_EQ(buf16.get_string_view(),
 | 
						|
            u"Alice, Bob, Charlie, David, Eve, Frank, Grace, Heidi, and Ivan");
 | 
						|
}
 | 
						|
 | 
						|
TEST(IntlListFormat, FormatToParts)
 | 
						|
{
 | 
						|
  ListFormat::Options options;
 | 
						|
  UniquePtr<ListFormat> lf =
 | 
						|
      ListFormat::TryCreate(MakeStringSpan("en-US"), options).unwrap();
 | 
						|
  ListFormat::StringList list;
 | 
						|
  MOZ_RELEASE_ASSERT(list.append(MakeStringSpan(u"Alice")));
 | 
						|
  MOZ_RELEASE_ASSERT(list.append(MakeStringSpan(u"Bob")));
 | 
						|
  MOZ_RELEASE_ASSERT(list.append(MakeStringSpan(u"Charlie")));
 | 
						|
 | 
						|
  TestBuffer<char16_t> buf16;
 | 
						|
  mozilla::intl::ListFormat::PartVector parts;
 | 
						|
  ASSERT_TRUE(lf->FormatToParts(list, buf16, parts).isOk());
 | 
						|
 | 
						|
  std::u16string_view strView = buf16.get_string_view();
 | 
						|
  ASSERT_EQ(strView, u"Alice, Bob, and Charlie");
 | 
						|
 | 
						|
  // 3 elements, and 2 literals.
 | 
						|
  ASSERT_EQ((parts.length()), (5u));
 | 
						|
 | 
						|
  auto getSubStringView = [strView, &parts](size_t index) {
 | 
						|
    size_t pos = index == 0 ? 0 : parts[index - 1].second;
 | 
						|
    size_t count = parts[index].second - pos;
 | 
						|
    return strView.substr(pos, count);
 | 
						|
  };
 | 
						|
 | 
						|
  ASSERT_EQ(parts[0].first, ListFormat::PartType::Element);
 | 
						|
  ASSERT_EQ(getSubStringView(0), u"Alice");
 | 
						|
 | 
						|
  ASSERT_EQ(parts[1].first, ListFormat::PartType::Literal);
 | 
						|
  ASSERT_EQ(getSubStringView(1), u", ");
 | 
						|
 | 
						|
  ASSERT_EQ(parts[2].first, ListFormat::PartType::Element);
 | 
						|
  ASSERT_EQ(getSubStringView(2), u"Bob");
 | 
						|
 | 
						|
  ASSERT_EQ(parts[3].first, ListFormat::PartType::Literal);
 | 
						|
  ASSERT_EQ(getSubStringView(3), u", and ");
 | 
						|
 | 
						|
  ASSERT_EQ(parts[4].first, ListFormat::PartType::Element);
 | 
						|
  ASSERT_EQ(getSubStringView(4), u"Charlie");
 | 
						|
}
 | 
						|
 | 
						|
}  // namespace mozilla::intl
 |