| OLD | NEW |
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/globals.h" | 5 #include "vm/globals.h" |
| 6 #include "vm/unicode.h" | 6 #include "vm/unicode.h" |
| 7 #include "vm/unit_test.h" | 7 #include "vm/unit_test.h" |
| 8 | 8 |
| 9 namespace dart { | 9 namespace dart { |
| 10 | 10 |
| 11 TEST_CASE(Utf8Decode) { | 11 TEST_CASE(Utf8Decode) { |
| (...skipping 821 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 833 | 833 |
| 834 // 5.1 - Single UTF-16 surrogates | 834 // 5.1 - Single UTF-16 surrogates |
| 835 | 835 |
| 836 // 5.1.1 - U+D800 = ed a0 80 = "\xED\xA0\x80" | 836 // 5.1.1 - U+D800 = ed a0 80 = "\xED\xA0\x80" |
| 837 { | 837 { |
| 838 const char* src = "\xED\xA0\x80"; | 838 const char* src = "\xED\xA0\x80"; |
| 839 int32_t expected[] = { 0xD800 }; | 839 int32_t expected[] = { 0xD800 }; |
| 840 int32_t dst[ARRAY_SIZE(expected)]; | 840 int32_t dst[ARRAY_SIZE(expected)]; |
| 841 memset(dst, 0, sizeof(dst)); | 841 memset(dst, 0, sizeof(dst)); |
| 842 bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst)); | 842 bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst)); |
| 843 EXPECT(!is_valid); | 843 EXPECT(is_valid); |
| 844 EXPECT(memcmp(expected, dst, sizeof(expected))); | 844 EXPECT(!memcmp(expected, dst, sizeof(expected))); |
| 845 } | 845 } |
| 846 | 846 |
| 847 // 5.1.2 - U+DB7F = ed ad bf = "\xED\xAD\xBF" | 847 // 5.1.2 - U+DB7F = ed ad bf = "\xED\xAD\xBF" |
| 848 { | 848 { |
| 849 const char* src = "\xED\xAD\xBF"; | 849 const char* src = "\xED\xAD\xBF"; |
| 850 int32_t expected[] = { 0xDB7F }; | 850 int32_t expected[] = { 0xDB7F }; |
| 851 int32_t dst[ARRAY_SIZE(expected)]; | 851 int32_t dst[ARRAY_SIZE(expected)]; |
| 852 memset(dst, 0, sizeof(dst)); | 852 memset(dst, 0, sizeof(dst)); |
| 853 bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst)); | 853 bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst)); |
| 854 EXPECT(!is_valid); | 854 EXPECT(is_valid); |
| 855 EXPECT(memcmp(expected, dst, sizeof(expected))); | 855 EXPECT(!memcmp(expected, dst, sizeof(expected))); |
| 856 } | 856 } |
| 857 | 857 |
| 858 // 5.1.3 - U+DB80 = ed ae 80 = "\xED\xAE\x80" | 858 // 5.1.3 - U+DB80 = ed ae 80 = "\xED\xAE\x80" |
| 859 { | 859 { |
| 860 const char* src = "\xED\xAE\x80"; | 860 const char* src = "\xED\xAE\x80"; |
| 861 int32_t expected[] = { 0xDB80 }; | 861 int32_t expected[] = { 0xDB80 }; |
| 862 int32_t dst[ARRAY_SIZE(expected)]; | 862 int32_t dst[ARRAY_SIZE(expected)]; |
| 863 memset(dst, 0, sizeof(dst)); | 863 memset(dst, 0, sizeof(dst)); |
| 864 bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst)); | 864 bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst)); |
| 865 EXPECT(!is_valid); | 865 EXPECT(is_valid); |
| 866 EXPECT(memcmp(expected, dst, sizeof(expected))); | 866 EXPECT(!memcmp(expected, dst, sizeof(expected))); |
| 867 } | 867 } |
| 868 | 868 |
| 869 // 5.1.4 - U+DBFF = ed af bf = "\xED\xAF\xBF" | 869 // 5.1.4 - U+DBFF = ed af bf = "\xED\xAF\xBF" |
| 870 { | 870 { |
| 871 const char* src = "\xED\xAF\xBF"; | 871 const char* src = "\xED\xAF\xBF"; |
| 872 int32_t expected[] = { 0xDBFF }; | 872 int32_t expected[] = { 0xDBFF }; |
| 873 int32_t dst[ARRAY_SIZE(expected)]; | 873 int32_t dst[ARRAY_SIZE(expected)]; |
| 874 memset(dst, 0, sizeof(dst)); | 874 memset(dst, 0, sizeof(dst)); |
| 875 bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst)); | 875 bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst)); |
| 876 EXPECT(!is_valid); | 876 EXPECT(is_valid); |
| 877 EXPECT(memcmp(expected, dst, sizeof(expected))); | 877 EXPECT(!memcmp(expected, dst, sizeof(expected))); |
| 878 } | 878 } |
| 879 | 879 |
| 880 // 5.1.5 - U+DC00 = ed b0 80 = "\xED\xB0\x80" | 880 // 5.1.5 - U+DC00 = ed b0 80 = "\xED\xB0\x80" |
| 881 { | 881 { |
| 882 const char* src = "\xED\xB0\x80"; | 882 const char* src = "\xED\xB0\x80"; |
| 883 int32_t expected[] = { 0xDC00 }; | 883 int32_t expected[] = { 0xDC00 }; |
| 884 int32_t dst[ARRAY_SIZE(expected)]; | 884 int32_t dst[ARRAY_SIZE(expected)]; |
| 885 memset(dst, 0, sizeof(dst)); | 885 memset(dst, 0, sizeof(dst)); |
| 886 bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst)); | 886 bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst)); |
| 887 EXPECT(!is_valid); | 887 EXPECT(is_valid); |
| 888 EXPECT(memcmp(expected, dst, sizeof(expected))); | 888 EXPECT(!memcmp(expected, dst, sizeof(expected))); |
| 889 } | 889 } |
| 890 | 890 |
| 891 // 5.1.6 - U+DF80 = ed be 80 = "\xED\xBE\x80" | 891 // 5.1.6 - U+DF80 = ed be 80 = "\xED\xBE\x80" |
| 892 { | 892 { |
| 893 const char* src = "\xED\xBE\x80"; | 893 const char* src = "\xED\xBE\x80"; |
| 894 int32_t expected[] = { 0xDF80 }; | 894 int32_t expected[] = { 0xDF80 }; |
| 895 int32_t dst[ARRAY_SIZE(expected)]; | 895 int32_t dst[ARRAY_SIZE(expected)]; |
| 896 memset(dst, 0, sizeof(dst)); | 896 memset(dst, 0, sizeof(dst)); |
| 897 bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst)); | 897 bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst)); |
| 898 EXPECT(!is_valid); | 898 EXPECT(is_valid); |
| 899 EXPECT(memcmp(expected, dst, sizeof(expected))); | 899 EXPECT(!memcmp(expected, dst, sizeof(expected))); |
| 900 } | 900 } |
| 901 | 901 |
| 902 // 5.1.7 - U+DFFF = ed bf bf = "\xED\xBF\xBF" | 902 // 5.1.7 - U+DFFF = ed bf bf = "\xED\xBF\xBF" |
| 903 { | 903 { |
| 904 const char* src = "\xED\xBF\xBF"; | 904 const char* src = "\xED\xBF\xBF"; |
| 905 int32_t expected[] = { 0xDFFF }; | 905 int32_t expected[] = { 0xDFFF }; |
| 906 int32_t dst[ARRAY_SIZE(expected)]; | 906 int32_t dst[ARRAY_SIZE(expected)]; |
| 907 memset(dst, 0, sizeof(dst)); | 907 memset(dst, 0, sizeof(dst)); |
| 908 bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst)); | 908 bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst)); |
| 909 EXPECT(!is_valid); | 909 EXPECT(is_valid); |
| 910 EXPECT(memcmp(expected, dst, sizeof(expected))); | 910 EXPECT(!memcmp(expected, dst, sizeof(expected))); |
| 911 } | 911 } |
| 912 | 912 |
| 913 // 5.2 Paired UTF-16 surrogates | 913 // 5.2 Paired UTF-16 surrogates |
| 914 | 914 |
| 915 // 5.2.1 - U+D800 U+DC00 = ed a0 80 ed b0 80 = "\xED\xA0\x80\xED\xB0\x80" | 915 // 5.2.1 - U+D800 U+DC00 = ed a0 80 ed b0 80 = "\xED\xA0\x80\xED\xB0\x80" |
| 916 { | 916 { |
| 917 const char* src = "\xED\xA0\x80\xED\xB0\x80"; | 917 const char* src = "\xED\xA0\x80\xED\xB0\x80"; |
| 918 int32_t expected[] = { 0xD800, 0xDC00 }; | 918 int32_t expected[] = { 0xD800, 0xDC00 }; |
| 919 int32_t dst[ARRAY_SIZE(expected)]; | 919 int32_t dst[ARRAY_SIZE(expected)]; |
| 920 memset(dst, 0, sizeof(dst)); | 920 memset(dst, 0, sizeof(dst)); |
| 921 bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst)); | 921 bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst)); |
| 922 EXPECT(!is_valid); | 922 EXPECT(is_valid); |
| 923 EXPECT(memcmp(expected, dst, sizeof(expected))); | 923 EXPECT(!memcmp(expected, dst, sizeof(expected))); |
| 924 } | 924 } |
| 925 | 925 |
| 926 // 5.2.2 - U+D800 U+DFFF = ed a0 80 ed bf bf = "\xED\xA0\x80\xED\xBF\xBF" | 926 // 5.2.2 - U+D800 U+DFFF = ed a0 80 ed bf bf = "\xED\xA0\x80\xED\xBF\xBF" |
| 927 { | 927 { |
| 928 const char* src = "\xED\xA0\x80\xED\xBF\xBF"; | 928 const char* src = "\xED\xA0\x80\xED\xBF\xBF"; |
| 929 int32_t expected[] = { 0xD800, 0xDFFF }; | 929 int32_t expected[] = { 0xD800, 0xDFFF }; |
| 930 int32_t dst[ARRAY_SIZE(expected)]; | 930 int32_t dst[ARRAY_SIZE(expected)]; |
| 931 memset(dst, 0, sizeof(dst)); | 931 memset(dst, 0, sizeof(dst)); |
| 932 bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst)); | 932 bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst)); |
| 933 EXPECT(!is_valid); | 933 EXPECT(is_valid); |
| 934 EXPECT(memcmp(expected, dst, sizeof(expected))); | 934 EXPECT(!memcmp(expected, dst, sizeof(expected))); |
| 935 } | 935 } |
| 936 | 936 |
| 937 // 5.2.3 - U+DB7F U+DC00 = ed a0 80 ed bf bf = "\xED\xAD\xBF\xED\xB0\x80" | 937 // 5.2.3 - U+DB7F U+DC00 = ed a0 80 ed bf bf = "\xED\xAD\xBF\xED\xB0\x80" |
| 938 { | 938 { |
| 939 const char* src = "\xED\xAD\xBF\xED\xB0\x80"; | 939 const char* src = "\xED\xAD\xBF\xED\xB0\x80"; |
| 940 int32_t expected[] = { 0xDB7F, 0xDC00 }; | 940 int32_t expected[] = { 0xDB7F, 0xDC00 }; |
| 941 int32_t dst[ARRAY_SIZE(expected)]; | 941 int32_t dst[ARRAY_SIZE(expected)]; |
| 942 memset(dst, 0, sizeof(dst)); | 942 memset(dst, 0, sizeof(dst)); |
| 943 bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst)); | 943 bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst)); |
| 944 EXPECT(!is_valid); | 944 EXPECT(is_valid); |
| 945 EXPECT(memcmp(expected, dst, sizeof(expected))); | 945 EXPECT(!memcmp(expected, dst, sizeof(expected))); |
| 946 } | 946 } |
| 947 | 947 |
| 948 // 5.2.4 - U+DB7F U+DFFF = ed ad bf ed bf bf = "\xED\xAD\xBF\xED\xBF\xBF" | 948 // 5.2.4 - U+DB7F U+DFFF = ed ad bf ed bf bf = "\xED\xAD\xBF\xED\xBF\xBF" |
| 949 { | 949 { |
| 950 const char* src = "\xED\xAD\xBF\xED\xBF\xBF"; | 950 const char* src = "\xED\xAD\xBF\xED\xBF\xBF"; |
| 951 int32_t expected[] = { 0xDB7F, 0xDFFF }; | 951 int32_t expected[] = { 0xDB7F, 0xDFFF }; |
| 952 int32_t dst[ARRAY_SIZE(expected)]; | 952 int32_t dst[ARRAY_SIZE(expected)]; |
| 953 memset(dst, 0, sizeof(dst)); | 953 memset(dst, 0, sizeof(dst)); |
| 954 bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst)); | 954 bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst)); |
| 955 EXPECT(!is_valid); | 955 EXPECT(is_valid); |
| 956 EXPECT(memcmp(expected, dst, sizeof(expected))); | 956 EXPECT(!memcmp(expected, dst, sizeof(expected))); |
| 957 } | 957 } |
| 958 | 958 |
| 959 // 5.2.5 - U+DB80 U+DC00 = ed ae 80 ed b0 80 = "\xED\xAE\x80\xED\xB0\x80" | 959 // 5.2.5 - U+DB80 U+DC00 = ed ae 80 ed b0 80 = "\xED\xAE\x80\xED\xB0\x80" |
| 960 { | 960 { |
| 961 const char* src = "\xED\xAE\x80\xED\xB0\x80"; | 961 const char* src = "\xED\xAE\x80\xED\xB0\x80"; |
| 962 int32_t expected[] = { 0xDB80, 0xDC00 }; | 962 int32_t expected[] = { 0xDB80, 0xDC00 }; |
| 963 int32_t dst[ARRAY_SIZE(expected)]; | 963 int32_t dst[ARRAY_SIZE(expected)]; |
| 964 memset(dst, 0, sizeof(dst)); | 964 memset(dst, 0, sizeof(dst)); |
| 965 bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst)); | 965 bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst)); |
| 966 EXPECT(!is_valid); | 966 EXPECT(is_valid); |
| 967 EXPECT(memcmp(expected, dst, sizeof(expected))); | 967 EXPECT(!memcmp(expected, dst, sizeof(expected))); |
| 968 } | 968 } |
| 969 | 969 |
| 970 // 5.2.6 - U+DB80 U+DFFF = ed ae 80 ed bf bf = "\xED\xAE\x80\xED\xBF\xBF" | 970 // 5.2.6 - U+DB80 U+DFFF = ed ae 80 ed bf bf = "\xED\xAE\x80\xED\xBF\xBF" |
| 971 { | 971 { |
| 972 const char* src = "\xED\xAE\x80\xED\xBF\xBF"; | 972 const char* src = "\xED\xAE\x80\xED\xBF\xBF"; |
| 973 int32_t expected[] = { 0xDB80, 0xDFFF }; | 973 int32_t expected[] = { 0xDB80, 0xDFFF }; |
| 974 int32_t dst[ARRAY_SIZE(expected)]; | 974 int32_t dst[ARRAY_SIZE(expected)]; |
| 975 memset(dst, 0, sizeof(dst)); | 975 memset(dst, 0, sizeof(dst)); |
| 976 bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst)); | 976 bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst)); |
| 977 EXPECT(!is_valid); | 977 EXPECT(is_valid); |
| 978 EXPECT(memcmp(expected, dst, sizeof(expected))); | 978 EXPECT(!memcmp(expected, dst, sizeof(expected))); |
| 979 } | 979 } |
| 980 | 980 |
| 981 // 5.2.7 - U+DBFF U+DC00 = ed af bf ed b0 80 = "\xED\xAF\xBF\xED\xB0\x80" | 981 // 5.2.7 - U+DBFF U+DC00 = ed af bf ed b0 80 = "\xED\xAF\xBF\xED\xB0\x80" |
| 982 { | 982 { |
| 983 const char* src = "\xED\xAF\xBF\xED\xB0\x80"; | 983 const char* src = "\xED\xAF\xBF\xED\xB0\x80"; |
| 984 int32_t expected[] = { 0xDBFF, 0xDC00 }; | 984 int32_t expected[] = { 0xDBFF, 0xDC00 }; |
| 985 int32_t dst[ARRAY_SIZE(expected)]; | 985 int32_t dst[ARRAY_SIZE(expected)]; |
| 986 memset(dst, 0, sizeof(dst)); | 986 memset(dst, 0, sizeof(dst)); |
| 987 bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst)); | 987 bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst)); |
| 988 EXPECT(!is_valid); | 988 EXPECT(is_valid); |
| 989 EXPECT(memcmp(expected, dst, sizeof(expected))); | 989 EXPECT(!memcmp(expected, dst, sizeof(expected))); |
| 990 } | 990 } |
| 991 | 991 |
| 992 // 5.2.8 - U+DBFF U+DFFF = ed af bf ed bf bf = "\xED\xAF\xBF\xED\xBF\xBF" | 992 // 5.2.8 - U+DBFF U+DFFF = ed af bf ed bf bf = "\xED\xAF\xBF\xED\xBF\xBF" |
| 993 { | 993 { |
| 994 const char* src = "\xED\xAF\xBF\xED\xBF\xBF"; | 994 const char* src = "\xED\xAF\xBF\xED\xBF\xBF"; |
| 995 int32_t expected[] = { 0xDBFF, 0xDFFF }; | 995 int32_t expected[] = { 0xDBFF, 0xDFFF }; |
| 996 int32_t dst[ARRAY_SIZE(expected)]; | 996 int32_t dst[ARRAY_SIZE(expected)]; |
| 997 memset(dst, 0, sizeof(dst)); | 997 memset(dst, 0, sizeof(dst)); |
| 998 bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst)); | 998 bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst)); |
| 999 EXPECT(!is_valid); | 999 EXPECT(is_valid); |
| 1000 EXPECT(memcmp(expected, dst, sizeof(expected))); | 1000 EXPECT(!memcmp(expected, dst, sizeof(expected))); |
| 1001 } | 1001 } |
| 1002 | 1002 |
| 1003 // 5.3 - Other illegal code positions | 1003 // 5.3 - Other illegal code positions |
| 1004 | 1004 |
| 1005 // 5.3.1 - U+FFFE = ef bf be = "\xEF\xBF\xBE" | 1005 // 5.3.1 - U+FFFE = ef bf be = "\xEF\xBF\xBE" |
| 1006 { | 1006 { |
| 1007 const char* src = "\xEF\xBF\xBE"; | 1007 const char* src = "\xEF\xBF\xBE"; |
| 1008 int32_t expected[] = { 0xFFFE }; | 1008 int32_t expected[] = { 0xFFFE }; |
| 1009 int32_t dst[ARRAY_SIZE(expected)]; | 1009 int32_t dst[ARRAY_SIZE(expected)]; |
| 1010 memset(dst, 0, sizeof(dst)); | 1010 memset(dst, 0, sizeof(dst)); |
| 1011 bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst)); | 1011 bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst)); |
| 1012 EXPECT(is_valid); | 1012 EXPECT(is_valid); |
| 1013 EXPECT(!memcmp(expected, dst, sizeof(expected))); | 1013 EXPECT(!memcmp(expected, dst, sizeof(expected))); |
| 1014 } | 1014 } |
| 1015 | 1015 |
| 1016 // 5.3.2 - U+FFFF = ef bf bf = "\xEF\xBF\xBF" | 1016 // 5.3.2 - U+FFFF = ef bf bf = "\xEF\xBF\xBF" |
| 1017 { | 1017 { |
| 1018 const char* src = "\xEF\xBF\xBF"; | 1018 const char* src = "\xEF\xBF\xBF"; |
| 1019 int32_t expected[] = { 0xFFFF }; | 1019 int32_t expected[] = { 0xFFFF }; |
| 1020 int32_t dst[ARRAY_SIZE(expected)]; | 1020 int32_t dst[ARRAY_SIZE(expected)]; |
| 1021 memset(dst, 0, sizeof(dst)); | 1021 memset(dst, 0, sizeof(dst)); |
| 1022 bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst)); | 1022 bool is_valid = Utf8::DecodeCStringToUTF32(src, dst, ARRAY_SIZE(dst)); |
| 1023 EXPECT(is_valid); | 1023 EXPECT(is_valid); |
| 1024 EXPECT(!memcmp(expected, dst, sizeof(expected))); | 1024 EXPECT(!memcmp(expected, dst, sizeof(expected))); |
| 1025 } | 1025 } |
| 1026 } | 1026 } |
| 1027 | 1027 |
| 1028 |
| 1029 TEST_CASE(Utf16Iterator) { |
| 1030 // Normal code units. |
| 1031 { |
| 1032 const int len = 4; |
| 1033 const uint16_t src[] = { 32, 33, 255, 256 }; |
| 1034 Utf16::CodePointIterator it(src, len); |
| 1035 for (int i = 0; i < len; i++) { |
| 1036 EXPECT(it.Next()); |
| 1037 EXPECT_EQ(src[i], it.Current()); |
| 1038 } |
| 1039 EXPECT(!it.Next()); |
| 1040 } |
| 1041 |
| 1042 // Surrogate pairs. |
| 1043 { |
| 1044 const uint16_t src[] = { 0xd800, 0xdc00, 0xd800, 0xdc01 }; |
| 1045 Utf16::CodePointIterator it(src, 4); |
| 1046 EXPECT(it.Next()); |
| 1047 EXPECT_EQ(0x10000, it.Current()); |
| 1048 EXPECT(it.Next()); |
| 1049 EXPECT_EQ(0x10001, it.Current()); |
| 1050 EXPECT(!it.Next()); |
| 1051 } |
| 1052 |
| 1053 // Surrogate characters not in pairs. |
| 1054 { |
| 1055 const uint16_t src[] = { 0xdc00, 0xd800 }; |
| 1056 Utf16::CodePointIterator it(src, 2); |
| 1057 EXPECT(it.Next()); |
| 1058 EXPECT_EQ(0xdc00, it.Current()); |
| 1059 EXPECT(it.Next()); |
| 1060 EXPECT_EQ(0xd800, it.Current()); |
| 1061 EXPECT(!it.Next()); |
| 1062 } |
| 1063 } |
| 1064 |
| 1028 } // namespace dart | 1065 } // namespace dart |
| OLD | NEW |