Fix FileReadStream::Peek4().
Until Read() reaches EOF, Peek4() must not take off by one in bufferLast_ into account; otherwise a buffer of size exactly 4 always returns NULL.
This commit is contained in:
parent
30d92a6399
commit
38d25d7458
1
bin/data/abcde.txt
Normal file
1
bin/data/abcde.txt
Normal file
@ -0,0 +1 @@
|
||||
abcde
|
@ -59,7 +59,7 @@ public:
|
||||
|
||||
// For encoding detection only.
|
||||
const Ch* Peek4() const {
|
||||
return (current_ + 4 <= bufferLast_) ? current_ : 0;
|
||||
return (current_ + 4 - !eof_ <= bufferLast_) ? current_ : 0;
|
||||
}
|
||||
|
||||
private:
|
||||
|
@ -21,7 +21,7 @@ using namespace rapidjson;
|
||||
|
||||
class FileStreamTest : public ::testing::Test {
|
||||
public:
|
||||
FileStreamTest() : filename_(), json_(), length_() {}
|
||||
FileStreamTest() : filename_(), json_(), length_(), abcde_() {}
|
||||
virtual ~FileStreamTest();
|
||||
|
||||
virtual void SetUp() {
|
||||
@ -49,6 +49,24 @@ public:
|
||||
size_t readLength = fread(json_, 1, length_, fp);
|
||||
json_[readLength] = '\0';
|
||||
fclose(fp);
|
||||
|
||||
const char *abcde_paths[] = {
|
||||
"data/abcde.txt",
|
||||
"bin/data/abcde.txt",
|
||||
"../bin/data/abcde.txt",
|
||||
"../../bin/data/abcde.txt",
|
||||
"../../../bin/data/abcde.txt"
|
||||
};
|
||||
fp = 0;
|
||||
for (size_t i = 0; i < sizeof(abcde_paths) / sizeof(abcde_paths[0]); i++) {
|
||||
fp = fopen(abcde_paths[i], "rb");
|
||||
if (fp) {
|
||||
abcde_ = abcde_paths[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
ASSERT_TRUE(fp != 0);
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
virtual void TearDown() {
|
||||
@ -64,6 +82,7 @@ protected:
|
||||
const char* filename_;
|
||||
char *json_;
|
||||
size_t length_;
|
||||
const char* abcde_;
|
||||
};
|
||||
|
||||
FileStreamTest::~FileStreamTest() {}
|
||||
@ -86,6 +105,30 @@ TEST_F(FileStreamTest, FileReadStream) {
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
TEST_F(FileStreamTest, FileReadStream_Peek4) {
|
||||
FILE *fp = fopen(abcde_, "rb");
|
||||
ASSERT_TRUE(fp != 0);
|
||||
char buffer[4];
|
||||
FileReadStream s(fp, buffer, sizeof(buffer));
|
||||
|
||||
const char* c = s.Peek4();
|
||||
for (int i = 0; i < 4; i++)
|
||||
EXPECT_EQ('a' + i, c[i]);
|
||||
EXPECT_EQ(0u, s.Tell());
|
||||
|
||||
for (int i = 0; i < 5; i++) {
|
||||
EXPECT_EQ(static_cast<size_t>(i), s.Tell());
|
||||
EXPECT_EQ('a' + i, s.Peek());
|
||||
EXPECT_EQ('a' + i, s.Peek());
|
||||
EXPECT_EQ('a' + i, s.Take());
|
||||
}
|
||||
EXPECT_EQ(5u, s.Tell());
|
||||
EXPECT_EQ(0, s.Peek());
|
||||
EXPECT_EQ(0, s.Take());
|
||||
|
||||
fclose(fp);
|
||||
}
|
||||
|
||||
TEST_F(FileStreamTest, FileWriteStream) {
|
||||
char filename[L_tmpnam];
|
||||
FILE* fp = TempFile(filename);
|
||||
|
Loading…
x
Reference in New Issue
Block a user