| 941 | } |
| 942 | |
| 943 | bool TestUTF16() |
| 944 | { |
| 945 | RET_ON_MAX_PORT |
| 946 | |
| 947 | bool fail = false; |
| 948 | CBufferedOutStream bout; |
| 949 | int r; |
| 950 | |
| 951 | asIScriptEngine *engine = asCreateScriptEngine(ANGELSCRIPT_VERSION); |
| 952 | engine->SetMessageCallback(asMETHOD(CBufferedOutStream, Callback), &bout, asCALL_THISCALL); |
| 953 | |
| 954 | engine->RegisterGlobalFunction("void assert(bool)", asFUNCTION(Assert), asCALL_GENERIC); |
| 955 | |
| 956 | // Set the string encoding to UTF16 (default is UTF8) |
| 957 | engine->SetEngineProperty(asEP_STRING_ENCODING, 1); |
| 958 | |
| 959 | // Register our UTF16 string type |
| 960 | engine->RegisterObjectType("string", sizeof(std::vector<asWORD>), asOBJ_VALUE | asOBJ_APP_CLASS_CDA); |
| 961 | engine->RegisterObjectBehaviour("string", asBEHAVE_CONSTRUCT, "void f()", asFUNCTION(StringConstructUTF16), asCALL_CDECL_OBJLAST); |
| 962 | engine->RegisterObjectBehaviour("string", asBEHAVE_DESTRUCT, "void f()", asFUNCTION(StringDestructUTF16), asCALL_CDECL_OBJLAST); |
| 963 | engine->RegisterObjectMethod("string", "string &opAssign(const string &in)", asMETHODPR(vector<asWORD>, operator=, (const vector<asWORD> &), vector<asWORD> &), asCALL_THISCALL); |
| 964 | engine->RegisterStringFactory("string", &stringFactoryUTF16); |
| 965 | vector<asWORD> str; |
| 966 | engine->RegisterGlobalProperty("string s", &str); |
| 967 | |
| 968 | // Test a normal ASCII string |
| 969 | r = ExecuteString(engine, "s = 'hello'"); |
| 970 | if( r != asEXECUTION_FINISHED ) |
| 971 | TEST_FAILED; |
| 972 | const unsigned short s[] = {'h','e','l','l','o'}; |
| 973 | if( str.size() != 5 || memcmp(&str[0], s, 10) != 0 ) |
| 974 | TEST_FAILED; |
| 975 | |
| 976 | // Test a string with UTF8 scanning above 127 and below 256 |
| 977 | r = ExecuteString(engine, "s = '\xC2\x80'"); |
| 978 | if( r != asEXECUTION_FINISHED ) |
| 979 | TEST_FAILED; |
| 980 | if( str.size() != 1 || str[0] != 128 ) |
| 981 | TEST_FAILED; |
| 982 | |
| 983 | // Test a string with escape sequence |
| 984 | r = ExecuteString(engine, "s = '\\n'"); |
| 985 | if( r != asEXECUTION_FINISHED ) |
| 986 | TEST_FAILED; |
| 987 | if( str.size() != 1 || str[0] != '\n' ) |
| 988 | TEST_FAILED; |
| 989 | |
| 990 | // Test a string with characters above 65535 (requires surrogate pairs) |
| 991 | r = ExecuteString(engine, "s = '\\U0010FFFFg'"); |
| 992 | if( r != asEXECUTION_FINISHED ) |
| 993 | TEST_FAILED; |
| 994 | if( str.size() != 3 || str[0] != 0xDBFF || str[1] != 0xDFFF || str[2] != 'g' ) |
| 995 | TEST_FAILED; |
| 996 | |
| 997 | // Test hexadecimal escape sequences |
| 998 | r = ExecuteString(engine, "s = '\\xFF'"); |
| 999 | if( r != asEXECUTION_FINISHED ) |
| 1000 | TEST_FAILED; |
no test coverage detected