Commit 872aba66 authored by Milo Yip's avatar Milo Yip

Improve coverage of encoded streams

parent 4be4857a
...@@ -109,6 +109,7 @@ public: ...@@ -109,6 +109,7 @@ public:
\param type UTF encoding type if it is not detected from the stream. \param type UTF encoding type if it is not detected from the stream.
*/ */
AutoUTFInputStream(InputByteStream& is, UTFType type = kUTF8) : is_(&is), type_(type), hasBOM_(false) { AutoUTFInputStream(InputByteStream& is, UTFType type = kUTF8) : is_(&is), type_(type), hasBOM_(false) {
RAPIDJSON_ASSERT(type >= kUTF8 && type <= kUTF32BE);
DetectType(); DetectType();
static const TakeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Take) }; static const TakeFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Take) };
takeFunc_ = f[type_]; takeFunc_ = f[type_];
...@@ -189,8 +190,6 @@ private: ...@@ -189,8 +190,6 @@ private:
case kUTF32BE: case kUTF32BE:
RAPIDJSON_ASSERT(sizeof(Ch) >= 4); RAPIDJSON_ASSERT(sizeof(Ch) >= 4);
break; break;
default:
RAPIDJSON_ASSERT(false); // Invalid type
} }
} }
...@@ -220,6 +219,8 @@ public: ...@@ -220,6 +219,8 @@ public:
\param putBOM Whether to write BOM at the beginning of the stream. \param putBOM Whether to write BOM at the beginning of the stream.
*/ */
AutoUTFOutputStream(OutputByteStream& os, UTFType type, bool putBOM) : os_(&os), type_(type) { AutoUTFOutputStream(OutputByteStream& os, UTFType type, bool putBOM) : os_(&os), type_(type) {
RAPIDJSON_ASSERT(type >= kUTF8 && type <= kUTF32BE);
// RUntime check whether the size of character type is sufficient. It only perform checks with assertion. // RUntime check whether the size of character type is sufficient. It only perform checks with assertion.
switch (type_) { switch (type_) {
case kUTF16LE: case kUTF16LE:
...@@ -233,8 +234,6 @@ public: ...@@ -233,8 +234,6 @@ public:
case kUTF8: case kUTF8:
// Do nothing // Do nothing
break; break;
default:
RAPIDJSON_ASSERT(false); // Invalid UTFType
} }
static const PutFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Put) }; static const PutFunc f[] = { RAPIDJSON_ENCODINGS_FUNC(Put) };
......
...@@ -119,10 +119,11 @@ protected: ...@@ -119,10 +119,11 @@ protected:
} }
EXPECT_EQ('\0', s.Peek()); EXPECT_EQ('\0', s.Peek());
free(data); free(data);
EXPECT_EQ(size, eis.Tell());
} }
} }
void TestAutoUTFInputStream(const char *filename) { void TestAutoUTFInputStream(const char *filename, bool expectHasBOM) {
// Test FileReadStream // Test FileReadStream
{ {
char buffer[16]; char buffer[16];
...@@ -130,6 +131,7 @@ protected: ...@@ -130,6 +131,7 @@ protected:
ASSERT_TRUE(fp != 0); ASSERT_TRUE(fp != 0);
FileReadStream fs(fp, buffer, sizeof(buffer)); FileReadStream fs(fp, buffer, sizeof(buffer));
AutoUTFInputStream<unsigned, FileReadStream> eis(fs); AutoUTFInputStream<unsigned, FileReadStream> eis(fs);
EXPECT_EQ(expectHasBOM, eis.HasBOM());
StringStream s(json_); StringStream s(json_);
while (eis.Peek() != '\0') { while (eis.Peek() != '\0') {
unsigned expected, actual; unsigned expected, actual;
...@@ -147,6 +149,7 @@ protected: ...@@ -147,6 +149,7 @@ protected:
char* data = ReadFile(filename, true, &size); char* data = ReadFile(filename, true, &size);
MemoryStream ms(data, size); MemoryStream ms(data, size);
AutoUTFInputStream<unsigned, MemoryStream> eis(ms); AutoUTFInputStream<unsigned, MemoryStream> eis(ms);
EXPECT_EQ(expectHasBOM, eis.HasBOM());
StringStream s(json_); StringStream s(json_);
while (eis.Peek() != '\0') { while (eis.Peek() != '\0') {
...@@ -264,16 +267,25 @@ TEST_F(EncodedStreamTest, EncodedInputStream) { ...@@ -264,16 +267,25 @@ TEST_F(EncodedStreamTest, EncodedInputStream) {
} }
TEST_F(EncodedStreamTest, AutoUTFInputStream) { TEST_F(EncodedStreamTest, AutoUTFInputStream) {
TestAutoUTFInputStream("utf8.json"); TestAutoUTFInputStream("utf8.json", false);
TestAutoUTFInputStream("utf8bom.json"); TestAutoUTFInputStream("utf8bom.json", true);
TestAutoUTFInputStream("utf16le.json"); TestAutoUTFInputStream("utf16le.json", false);
TestAutoUTFInputStream("utf16lebom.json"); TestAutoUTFInputStream("utf16lebom.json",true);
TestAutoUTFInputStream("utf16be.json"); TestAutoUTFInputStream("utf16be.json", false);
TestAutoUTFInputStream("utf16bebom.json"); TestAutoUTFInputStream("utf16bebom.json",true);
TestAutoUTFInputStream("utf32le.json"); TestAutoUTFInputStream("utf32le.json", false);
TestAutoUTFInputStream("utf32lebom.json"); TestAutoUTFInputStream("utf32lebom.json",true);
TestAutoUTFInputStream("utf32be.json"); TestAutoUTFInputStream("utf32be.json", false);
TestAutoUTFInputStream("utf32bebom.json"); TestAutoUTFInputStream("utf32bebom.json", true);
{
// Auto detection fail, use user defined UTF type
const char json[] = "{}";
MemoryStream ms(json, sizeof(json));
AutoUTFInputStream<unsigned, MemoryStream> eis(ms, kUTF8);
EXPECT_FALSE(eis.HasBOM());
EXPECT_EQ(kUTF8, eis.GetType());
}
} }
TEST_F(EncodedStreamTest, EncodedOutputStream) { TEST_F(EncodedStreamTest, EncodedOutputStream) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment