1 //===-- Unittests for the scanf String Reader -----------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "src/__support/CPP/string_view.h"
10 #include "src/stdio/scanf_core/reader.h"
12 #include "test/UnitTest/Test.h"
14 TEST(LlvmLibcScanfStringReaderTest
, Constructor
) {
16 // buff_len justneeds to be a big number. The specific value isn't important
18 LIBC_NAMESPACE::scanf_core::ReadBuffer rb
{const_cast<char *>(str
), 1000000};
19 LIBC_NAMESPACE::scanf_core::Reader
reader(&rb
);
22 TEST(LlvmLibcScanfStringReaderTest
, SimpleRead
) {
23 const char *str
= "abc";
24 LIBC_NAMESPACE::scanf_core::ReadBuffer rb
{const_cast<char *>(str
), 1000000};
25 LIBC_NAMESPACE::scanf_core::Reader
reader(&rb
);
27 for (size_t i
= 0; i
< sizeof("abc"); ++i
) {
28 ASSERT_EQ(str
[i
], reader
.getc());
32 TEST(LlvmLibcScanfStringReaderTest
, ReadAndReverse
) {
33 const char *str
= "abcDEF123";
34 LIBC_NAMESPACE::scanf_core::ReadBuffer rb
{const_cast<char *>(str
), 1000000};
35 LIBC_NAMESPACE::scanf_core::Reader
reader(&rb
);
37 for (size_t i
= 0; i
< 5; ++i
) {
38 ASSERT_EQ(str
[i
], reader
.getc());
41 // Move back by 3, cursor should now be on 2
42 reader
.ungetc(str
[4]);
43 reader
.ungetc(str
[3]);
44 reader
.ungetc(str
[2]);
46 for (size_t i
= 2; i
< 7; ++i
) {
47 ASSERT_EQ(str
[i
], reader
.getc());
50 // Move back by 2, cursor should now be on 5
51 reader
.ungetc(str
[6]);
52 reader
.ungetc(str
[5]);
54 for (size_t i
= 5; i
< 10; ++i
) {
55 ASSERT_EQ(str
[i
], reader
.getc());
58 // Move back by 10, which should be back to the start.
59 for (size_t i
= 0; i
< 10; ++i
) {
60 reader
.ungetc(str
[9 - i
]);
63 // Check the whole string.
64 for (size_t i
= 0; i
< sizeof("abcDEF123"); ++i
) {
65 ASSERT_EQ(str
[i
], reader
.getc());