%# -*- mode: C++ -*- %# Ignore the following admonition; it applies to the resulting .cpp file only //// Automatically Generated From UnicodeExtendedGraphemeClusters.cpp.gyb. //// Do Not Edit Directly! //===----------------------------------------------------------------------===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2016 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See http://swift.org/LICENSE.txt for license information // See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// %{ from GYBUnicodeDataUtils import get_grapheme_cluster_break_tests_as_utf8 grapheme_cluster_break_tests = \ get_grapheme_cluster_break_tests_as_utf8(unicodeGraphemeBreakTestFile) }% #include "swift/Basic/Unicode.h" #include "gtest/gtest.h" #include using namespace swift; using namespace swift::unicode; static std::vector FindGraphemeClusterBoundaries(StringRef Str) { std::vector Result; Result.push_back(0); unsigned Pos = 0; while (Pos != Str.size()) { Pos += extractFirstExtendedGraphemeCluster(Str.substr(Pos)).size(); Result.push_back(Pos); } return Result; } TEST(ExtractExtendedGraphemeCluster, TestsFromUnicodeSpec) { % for subject_string,expected_boundaries in grapheme_cluster_break_tests: EXPECT_EQ((std::vector{ ${', '.join([ str(x) for x in expected_boundaries ])} }), FindGraphemeClusterBoundaries("${subject_string}")); % end } TEST(ExtractExtendedGraphemeCluster, ExtraTests) { // // Sequences with one continuation byte missing // EXPECT_EQ((std::vector{ 0, 1 }), FindGraphemeClusterBoundaries("\xc2")); // // Isolated surrogates // EXPECT_EQ((std::vector{ 0, 1, 2, 3 }), FindGraphemeClusterBoundaries("\xed\xa0\x80")); EXPECT_EQ((std::vector{ 0, 4, 5, 6, 11 }), FindGraphemeClusterBoundaries( "\xf3\xa0\x84\x80" "\xed\xa0\x80" "\xf3\xa0\x84\x80")); }