13
13
14
14
using namespace Fortran ::runtime;
15
15
16
+ template <std::size_t n = 64 >
17
+ static OwningPtr<Descriptor> CreateEmptyCharDescriptor () {
18
+ OwningPtr<Descriptor> descriptor{Descriptor::Create (
19
+ sizeof (char ), n, nullptr , 0 , nullptr , CFI_attribute_allocatable)};
20
+ if (descriptor->Allocate () != 0 ) {
21
+ return nullptr ;
22
+ }
23
+ return descriptor;
24
+ }
25
+
16
26
class CommandFixture : public ::testing::Test {
17
27
protected:
18
28
CommandFixture (int argc, const char *argv[]) {
19
29
RTNAME (ProgramStart)(argc, argv, {});
20
30
}
31
+
32
+ std::string GetPaddedStr (const char *text, std::size_t len) const {
33
+ std::string res{text};
34
+ assert (res.length () <= len && " No room to pad" );
35
+ res.append (len - res.length (), ' ' );
36
+ return res;
37
+ }
38
+
39
+ void CheckDescriptorEqStr (
40
+ const Descriptor *value, const std::string &expected) const {
41
+ EXPECT_EQ (std::strncmp (value->OffsetElement (), expected.c_str (),
42
+ value->ElementBytes ()),
43
+ 0 );
44
+ }
45
+
46
+ void CheckArgumentValue (int n, const char *argv) const {
47
+ OwningPtr<Descriptor> value{CreateEmptyCharDescriptor ()};
48
+ ASSERT_NE (value, nullptr );
49
+
50
+ std::string expected{GetPaddedStr (argv, value->ElementBytes ())};
51
+
52
+ EXPECT_EQ (RTNAME (ArgumentValue)(n, value.get (), nullptr ), 0 );
53
+ CheckDescriptorEqStr (value.get (), expected);
54
+ }
55
+
56
+ void CheckMissingArgumentValue (int n) const {
57
+ OwningPtr<Descriptor> value{CreateEmptyCharDescriptor ()};
58
+ ASSERT_NE (value, nullptr );
59
+
60
+ EXPECT_GT (RTNAME (ArgumentValue)(n, value.get (), nullptr ), 0 );
61
+
62
+ std::string spaces (value->ElementBytes (), ' ' );
63
+ CheckDescriptorEqStr (value.get (), spaces);
64
+ }
21
65
};
22
66
23
67
static const char *commandOnlyArgv[]{" aProgram" };
@@ -34,6 +78,10 @@ TEST_F(ZeroArguments, ArgumentLength) {
34
78
EXPECT_EQ (0 , RTNAME (ArgumentLength)(1 ));
35
79
}
36
80
81
+ TEST_F (ZeroArguments, ArgumentValue) {
82
+ CheckArgumentValue (0 , commandOnlyArgv[0 ]);
83
+ }
84
+
37
85
static const char *oneArgArgv[]{" aProgram" , " anArgumentOfLength20" };
38
86
class OneArgument : public CommandFixture {
39
87
protected:
@@ -49,6 +97,11 @@ TEST_F(OneArgument, ArgumentLength) {
49
97
EXPECT_EQ (0 , RTNAME (ArgumentLength)(2 ));
50
98
}
51
99
100
+ TEST_F (OneArgument, ArgumentValue) {
101
+ CheckArgumentValue (0 , oneArgArgv[0 ]);
102
+ CheckArgumentValue (1 , oneArgArgv[1 ]);
103
+ }
104
+
52
105
static const char *severalArgsArgv[]{
53
106
" aProgram" , " 16-char-long-arg" , " " , " -22-character-long-arg" , " o" };
54
107
class SeveralArguments : public CommandFixture {
@@ -71,3 +124,28 @@ TEST_F(SeveralArguments, ArgumentLength) {
71
124
EXPECT_EQ (1 , RTNAME (ArgumentLength)(4 ));
72
125
EXPECT_EQ (0 , RTNAME (ArgumentLength)(5 ));
73
126
}
127
+
128
+ TEST_F (SeveralArguments, ArgumentValue) {
129
+ CheckArgumentValue (0 , severalArgsArgv[0 ]);
130
+ CheckArgumentValue (1 , severalArgsArgv[1 ]);
131
+ CheckMissingArgumentValue (2 );
132
+ CheckArgumentValue (3 , severalArgsArgv[3 ]);
133
+ CheckArgumentValue (4 , severalArgsArgv[4 ]);
134
+ }
135
+
136
+ TEST_F (SeveralArguments, NoArgumentValue) {
137
+ // Make sure we don't crash if the 'value' and 'error' parameters aren't
138
+ // passed.
139
+ EXPECT_EQ (RTNAME (ArgumentValue)(2 , nullptr , nullptr ), 0 );
140
+ EXPECT_GT (RTNAME (ArgumentValue)(-1 , nullptr , nullptr ), 0 );
141
+ }
142
+
143
+ TEST_F (SeveralArguments, ArgumentValueErrors) {
144
+ CheckMissingArgumentValue (-1 );
145
+ CheckMissingArgumentValue (5 );
146
+
147
+ OwningPtr<Descriptor> tooShort{CreateEmptyCharDescriptor<15 >()};
148
+ ASSERT_NE (tooShort, nullptr );
149
+ EXPECT_EQ (RTNAME (ArgumentValue)(1 , tooShort.get (), nullptr ), -1 );
150
+ CheckDescriptorEqStr (tooShort.get (), severalArgsArgv[1 ]);
151
+ }
0 commit comments