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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
// file : build2/test/script/script -*- C++ -*-
// copyright : Copyright (c) 2014-2016 Code Synthesis Ltd
// license : MIT; see accompanying LICENSE file
#ifndef BUILD2_TEST_SCRIPT_SCRIPT
#define BUILD2_TEST_SCRIPT_SCRIPT
#include <build2/types>
#include <build2/utility>
#include <build2/variable>
namespace build2
{
class target;
namespace test
{
namespace script
{
enum class redirect_type
{
none,
null,
here_string, // Value is the string.
here_document // Value is the document.
};
struct redirect
{
redirect_type type = redirect_type::none;
string value;
};
struct command
{
path program;
strings arguments;
redirect in;
redirect out;
redirect err;
};
enum class exit_comparison {eq, ne};
struct command_exit
{
// @@ Need to understand what type we should use for status.
exit_comparison comparison = exit_comparison::eq;
uint16_t status = 0;
};
struct test: command
{
command_exit exit;
};
class script
{
public:
script (target& tt, target& st)
: test_target (tt), script_target (st) {}
public:
target& test_target; // Target we are testing.
target& script_target; // Target of the testscript file.
public:
// Note that if we pass the variable name as a string, then it will
// be looked up in the wrong pool.
//
variable_pool var_pool;
variable_map vars;
// Lookup the variable starting from this scope, continuing with outer
// scopes, then the target being tested, then the testscript target,
// and then outer buildfile scopes (including testscript-type/pattern
// specific).
//
lookup
find (const variable&) const;
// Return a value suitable for assignment. If the variable does not
// exist in this scope's map, then a new one with the NULL value is
// added and returned. Otherwise the existing value is returned.
//
value&
assign (const variable& var) {return vars.assign (var);}
// Return a value suitable for append/prepend. If the variable does
// not exist in this scope's map, then outer scopes are searched for
// the same variable. If found then a new variable with the found
// value is added to this scope and returned. Otherwise this function
// proceeds as assign() above.
//
value&
append (const variable&);
};
}
}
}
#endif // BUILD2_TEST_SCRIPT_SCRIPT
|