aboutsummaryrefslogtreecommitdiff
path: root/libbuild2/test/script/script.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'libbuild2/test/script/script.cxx')
-rw-r--r--libbuild2/test/script/script.cxx58
1 files changed, 50 insertions, 8 deletions
diff --git a/libbuild2/test/script/script.cxx b/libbuild2/test/script/script.cxx
index 3f615ee..cb367bc 100644
--- a/libbuild2/test/script/script.cxx
+++ b/libbuild2/test/script/script.cxx
@@ -94,12 +94,37 @@ namespace build2
const_cast<path&> (id_path) = path (move (s));
}
- // Calculate the working directory path unless this is the root scope
- // (handled in an ad hoc way).
+ // Calculate the working directory path and the test programs set
+ // unless this is the root scope (handled in an ad hoc way).
//
if (p != nullptr)
+ {
const_cast<dir_path&> (*work_dir.path) =
dir_path (*p->work_dir.path) /= id;
+
+ // Note that we could probably keep the test programs sets fully
+ // independent across the scopes and check if the program is a test
+ // by traversing the scopes upwards recursively. Note though, that
+ // the parent scope's set cannot change during the nested scope
+ // lifetime and normally contains just a single entry. Thus, it
+ // seems more efficient to get rid of the recursion by copying the
+ // set from the parent now and potentially changing it later on the
+ // test variable assignment, etc.
+ //
+ test_programs_ = p->test_programs_;
+ }
+ }
+
+ bool scope::
+ test_program (const path& p)
+ {
+ assert (!test_programs_.empty ());
+
+ return find_if (test_programs_.begin (), test_programs_.end (),
+ [&p] (const path* tp)
+ {
+ return tp != nullptr ? *tp == p : false;
+ }) != test_programs_.end ();
}
void scope::
@@ -287,6 +312,12 @@ namespace build2
}
}
+ // Reserve the entry for the test program specified via the test
+ // variable. Note that the value will be assigned by the below
+ // reset_special() call.
+ //
+ test_programs_.push_back (nullptr);
+
// Set the special $*, $N variables.
//
reset_special ();
@@ -378,7 +409,8 @@ namespace build2
void scope::
reset_special ()
{
- // First assemble the $* value.
+ // First assemble the $* value and save the test variable value into
+ // the test program set.
//
strings s;
@@ -387,14 +419,24 @@ namespace build2
s.insert (s.end (), v.begin (), v.end ());
};
+ // If the test variable can't be looked up for any reason (is NULL,
+ // etc), then keep $* empty.
+ //
if (auto l = lookup (root.test_var))
- s.push_back (cast<path> (l).representation ());
+ {
+ const path& p (cast<path> (l));
+ s.push_back (p.representation ());
- if (auto l = lookup (root.options_var))
- append (cast<strings> (l));
+ test_programs_[0] = &p;
- if (auto l = lookup (root.arguments_var))
- append (cast<strings> (l));
+ if (auto l = lookup (root.options_var))
+ append (cast<strings> (l));
+
+ if (auto l = lookup (root.arguments_var))
+ append (cast<strings> (l));
+ }
+ else
+ test_programs_[0] = nullptr;
// Keep redirects/cleanups out of $N.
//