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.
|
// For encoding detection only.
|
||||||
const Ch* Peek4() const {
|
const Ch* Peek4() const {
|
||||||
return (current_ + 4 <= bufferLast_) ? current_ : 0;
|
return (current_ + 4 - !eof_ <= bufferLast_) ? current_ : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -21,7 +21,7 @@ using namespace rapidjson;
|
|||||||
|
|
||||||
class FileStreamTest : public ::testing::Test {
|
class FileStreamTest : public ::testing::Test {
|
||||||
public:
|
public:
|
||||||
FileStreamTest() : filename_(), json_(), length_() {}
|
FileStreamTest() : filename_(), json_(), length_(), abcde_() {}
|
||||||
virtual ~FileStreamTest();
|
virtual ~FileStreamTest();
|
||||||
|
|
||||||
virtual void SetUp() {
|
virtual void SetUp() {
|
||||||
@ -49,6 +49,24 @@ public:
|
|||||||
size_t readLength = fread(json_, 1, length_, fp);
|
size_t readLength = fread(json_, 1, length_, fp);
|
||||||
json_[readLength] = '\0';
|
json_[readLength] = '\0';
|
||||||
fclose(fp);
|
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() {
|
virtual void TearDown() {
|
||||||
@ -64,6 +82,7 @@ protected:
|
|||||||
const char* filename_;
|
const char* filename_;
|
||||||
char *json_;
|
char *json_;
|
||||||
size_t length_;
|
size_t length_;
|
||||||
|
const char* abcde_;
|
||||||
};
|
};
|
||||||
|
|
||||||
FileStreamTest::~FileStreamTest() {}
|
FileStreamTest::~FileStreamTest() {}
|
||||||
@ -86,6 +105,30 @@ TEST_F(FileStreamTest, FileReadStream) {
|
|||||||
fclose(fp);
|
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) {
|
TEST_F(FileStreamTest, FileWriteStream) {
|
||||||
char filename[L_tmpnam];
|
char filename[L_tmpnam];
|
||||||
FILE* fp = TempFile(filename);
|
FILE* fp = TempFile(filename);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user