forked from masak/proto
-
Notifications
You must be signed in to change notification settings - Fork 27
/
build.t
108 lines (93 loc) · 4.11 KB
/
build.t
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
106
107
108
use v6;
use Test;
use App::Pls;
my %projects =
fetched => { :state<fetched> },
unfetched => {},
"won't-fetch" => {},
"won't-build" => {},
# RAKUDO: Need quotes around keys starting with 'has-' [perl #75694]
'has-deps' => { :state<fetched>, :deps<A B> },
A => { :state<fetched> },
B => { :state<fetched>, :deps<C D> },
C => {},
D => { :state<built> },
circ-deps => { :state<fetched>, :deps<E> },
E => { :state<fetched>, :deps<circ-deps> },
dirdep-fails => { :state<fetched>, :deps<won't-build> }, #'
indir-fails => { :state<fetched>, :deps<dirdep-fails> },
;
my @actions;
class Mock::Fetcher does App::Pls::Builder {
method fetch($project --> Result) {
push @actions, "fetch[$project<name>]";
$project<name> eq "won't-fetch" ?? failure !! success;
}
}
class Mock::Builder does App::Pls::Builder {
method build($project --> Result) {
push @actions, "build[$project<name>]";
$project<name> eq "won't-build" ?? failure !! success;
}
}
my $core = App::Pls::Core.new(
:projects(App::Pls::ProjectsState::Hash.new(:%projects)),
:ecosystem(App::Pls::Ecosystem::Hash.new(:%projects)),
:fetcher(Mock::Fetcher.new()),
:builder(Mock::Builder.new()),
);
plan 31;
given $core {
# [T] Build a project: Succeed.
is .state-of('fetched'), 'fetched', "State before: 'fetched'";
is .build(<fetched>), success, "Building project succeeded";
is .state-of('fetched'), 'built', "State after: 'built'";
# [T] Build an unfetched project: Fetch, build.
@actions = ();
is .state-of('unfetched'), 'absent', "State before: 'absent'";
is .build(<unfetched>), success, "Building unfetched project succeeded";
is ~@actions, 'fetch[unfetched] build[unfetched]',
"Fetched the project before building it";
is .state-of('unfetched'), 'built', "State after of unfetched: 'built'";
# [T] Build an unfetched project; fetch fails. Fail.
@actions = ();
is .build(<won't-fetch>), failure, "Won't build if fetch fails"; # "
is ~@actions, "fetch[won't-fetch]", "Didn't try building";
is .state-of("won't-fetch"), 'absent',
"State after of won't-fetch: unchanged";
# [T] Build a project; a build error occurs: Fail.
@actions = ();
is .build(<won't-build>), failure, "Won't build if build fails"; # "
is ~@actions, "fetch[won't-build] build[won't-build]", "Tried building";
is .state-of("won't-build"), 'fetched',
"State after of won't-build: 'fetched'";
# [T] Build a project with dependencies: Build dependencies first.
@actions = ();
is .build(<has-deps>), success, "Building project with deps succeeds";
is ~@actions, "fetch[C] build[A] build[C] build[B] build[has-deps]",
"Fetch before build, build with postorder traversal";
is .state-of('has-deps'), 'built', "State after of has-deps: built";
for <A B C D> -> $dep {
is .state-of($dep), 'built', "State after of $dep: built";
}
# [T] Build a project with circular dependencies: Fail.
@actions = ();
is .build(<circ-deps>), failure, "Building project with circ deps fails";
is ~@actions, "", "Didn't even try to build anything";
is .state-of('circ-deps'), 'fetched', "State after of circ-deps: unchanged";
is .state-of('E'), 'fetched', "State after of E: unchanged";
# [T] Build a project whose direct dependency fails: Fail.
is .build(<dirdep-fails>), failure, "Fail when direct dep fails to build";
is .state-of('dirdep-fails'), 'fetched',
"State after of dirdep-fails: unchanged";
is .state-of("won't-build"), 'fetched',
"State after of won't-build: unchanged";
# [T] Build a project whose indirect dependency fails: Fail.
is .build(<indir-fails>), failure, "Fail when indirect dep fails to build";
is .state-of('indir-fails'), 'fetched',
"State after of indir-fails: unchanged";
is .state-of('dirdep-fails'), 'fetched',
"State after of dirdep-fails: unchanged";
is .state-of("won't-build"), 'fetched',
"State after of won't-build: unchanged";
}