forked from carbon-language/carbon-lang
-
Notifications
You must be signed in to change notification settings - Fork 0
/
parse_test_matchers_internal.h
60 lines (46 loc) · 1.76 KB
/
parse_test_matchers_internal.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
// Exceptions. See /LICENSE for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#ifndef CARBON_EXPLORER_SYNTAX_PARSE_TEST_MATCHERS_INTERNAL_H_
#define CARBON_EXPLORER_SYNTAX_PARSE_TEST_MATCHERS_INTERNAL_H_
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <ostream>
#include <variant>
#include "explorer/syntax/parse.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/raw_ostream.h"
namespace Carbon::TestingInternal {
// Implementation of ParsedAs(). See there for detailed documentation.
class ParsedAsMatcher {
public:
// NOLINTNEXTLINE(readability-identifier-naming)
using is_gtest_matcher = void;
explicit ParsedAsMatcher(::testing::Matcher<AST> ast_matcher)
: ast_matcher_(std::move(ast_matcher)) {}
void DescribeTo(std::ostream* out) const {
DescribeToImpl(out, /*negated=*/false);
}
void DescribeNegationTo(std::ostream* out) const {
DescribeToImpl(out, /*negated=*/true);
}
auto MatchAndExplain(const ErrorOr<AST>& result,
::testing::MatchResultListener* listener) const -> bool {
if (!result.ok()) {
*listener << "is a failed parse with error: " << result.error().message();
return false;
} else {
*listener << "is a successful parse whose ";
return ast_matcher_.MatchAndExplain(*result, listener);
}
}
private:
void DescribeToImpl(std::ostream* out, bool negated) const {
*out << "is " << (negated ? "not " : "")
<< "a successful parse result whose ";
ast_matcher_.DescribeTo(out);
}
::testing::Matcher<AST> ast_matcher_;
};
} // namespace Carbon::TestingInternal
#endif // CARBON_EXPLORER_SYNTAX_PARSE_TEST_MATCHERS_INTERNAL_H_