mirror of
https://github.com/Tencent/rapidjson.git
synced 2025-03-10 03:29:59 +01:00
Improve coverage of encoded streams
This commit is contained in:
parent
4be4857a19
commit
872aba660c
@ -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:
|
|||||||
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:
|
|||||||
\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:
|
|||||||
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:
|
|||||||
}
|
}
|
||||||
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:
|
|||||||
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:
|
|||||||
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) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
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) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user