/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <folly/gen/IStream.h>
#include <sstream>
#include <string>
#include <utility>
#include <vector>
#include <folly/gen/Base.h>
#include <folly/gen/String.h>
#include <folly/portability/GTest.h>
namespace folly {
namespace gen {
// Test mixed consumption of std::istream with and without folly::gen, and
// demonstrates partial consumption of input.
TEST(IStream, ByLine) {
std::stringstream in(
"2\n" // Count applies to both below groups.
"1\tred\n"
"3\tblue\n"
"3.4\t5.6\t7.8\n"
"1.1\t2.2\t3.3\n");
size_t n;
in >> n;
in.get(); // Consume trailing newline
auto colors = byLine(in) | take(n) | eachToPair<int, std::string>('\t') |
as<std::vector>();
auto coords = byLine(in) | take(n) | eachToTuple<float, float, float>('\t') |
as<std::vector>();
EXPECT_EQ(
colors,
(std::vector<std::pair<int, std::string>>{
{1, "red"},
{3, "blue"},
}));
EXPECT_EQ(
coords,
(std::vector<std::tuple<float, float, float>>({
std::tuple<float, float, float>{3.4f, 5.6f, 7.8f},
std::tuple<float, float, float>{1.1f, 2.2f, 3.3f},
})));
}
} // namespace gen
} // namespace folly