| %# -*- 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 - 2017 Apple Inc. and the Swift project authors |
| // Licensed under Apache License v2.0 with Runtime Library Exception |
| // |
| // See https://swift.org/LICENSE.txt for license information |
| // See https://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 <vector> |
| |
| using namespace swift; |
| using namespace swift::unicode; |
| |
| static std::vector<unsigned> FindGraphemeClusterBoundaries(StringRef Str) { |
| std::vector<unsigned> 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<unsigned>{ ${', '.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<unsigned>{ 0, 1 }), |
| FindGraphemeClusterBoundaries("\xc2")); |
| |
| // |
| // Isolated surrogates |
| // |
| |
| EXPECT_EQ((std::vector<unsigned>{ 0, 1, 2, 3 }), |
| FindGraphemeClusterBoundaries("\xed\xa0\x80")); |
| EXPECT_EQ((std::vector<unsigned>{ 0, 4, 5, 6, 11 }), |
| FindGraphemeClusterBoundaries( |
| "\xf3\xa0\x84\x80" "\xed\xa0\x80" "\xf3\xa0\x84\x80")); |
| } |
| |