Skip to content

Commit b10d39d

Browse files
committed
Add non_versioned_output_test and use it for test-haddock
Keeping the expected output files in sync with the different GHC versions and platforms has always been a tedious task. Also, we did not expect these files because we knew these would manifest, but only updated the values after a test failed. So, this adds a unittest which strips off the version suffixes from the output files before checking. Now updating / adding a new GHC version should be easier.
1 parent 303ef80 commit b10d39d

File tree

2 files changed

+79
-127
lines changed

2 files changed

+79
-127
lines changed

rules_haskell_tests/tests/BUILD.bazel

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ load("@rules_haskell//tests:inline_tests.bzl", "sh_inline_test")
2727
load("@rules_haskell_ghc_version//:ghc_version.bzl", "GHC_VERSION")
2828
load("@rules_shell//shell:sh_test.bzl", "sh_test")
2929
load("//tests:rule_test_exe.bzl", "rule_test_exe")
30-
load("//tests:test_haddock.bzl", "expected_values")
30+
load("//tests:test_haddock.bzl", "non_versioned_output_test")
3131

3232
# prefer the GHC version set by rules_haskell, use the default test GHC version otherwise
3333
TEST_GHC_VERSION = GHC_VERSION or DEFAULT_TEST_GHC_VERSION
@@ -205,11 +205,24 @@ rule_test_exe(
205205
rule = "//tests/hsc",
206206
)
207207

208-
rule_test(
208+
non_versioned_output_test(
209209
name = "test-haddock",
210210
size = "small",
211-
generates = expected_values(TEST_GHC_VERSION),
212-
rule = "//tests/haddock",
211+
generates = [
212+
"haddock/array",
213+
"haddock/base",
214+
"haddock/deepseq",
215+
"haddock/ghc-bignum",
216+
"haddock/ghc-prim",
217+
"haddock/index",
218+
"haddock/pretty",
219+
"haddock/template-haskell",
220+
"haddock/testsZShaddockZShaddock-lib-a",
221+
"haddock/testsZShaddockZShaddock-lib-b",
222+
"haddock/testsZShaddockZShaddock-lib-deep",
223+
"haddock/ghc-boot-th",
224+
],
225+
target_under_test = "//tests/haddock",
213226
)
214227

215228
rule_test(
Lines changed: 62 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -1,127 +1,66 @@
11
""" Compute expected results for the //tests:test-haddock test"""
22

3-
load("@os_info//:os_info.bzl", "cpu_value", "is_darwin", "is_linux", "is_nix_shell", "is_windows")
3+
load("@bazel_skylib//lib:new_sets.bzl", "sets")
4+
load("@bazel_skylib//lib:unittest.bzl", "analysistest", "asserts")
5+
load("@bazel_tools//tools/build_rules:test_rules.bzl", "strip_prefix")
46

5-
def expected_values(test_ghc_version):
6-
if test_ghc_version == "9.2.8":
7-
return [
8-
"haddock/array-0.5.4.0",
9-
"haddock/base-4.16.4.0",
10-
"haddock/deepseq-1.4.6.1",
11-
"haddock/ghc-bignum-1.2",
12-
"haddock/ghc-prim-0.8.0",
13-
"haddock/index",
14-
"haddock/pretty-1.1.3.6",
15-
"haddock/template-haskell-2.18.0.0",
16-
"haddock/testsZShaddockZShaddock-lib-a",
17-
"haddock/testsZShaddockZShaddock-lib-b",
18-
"haddock/testsZShaddockZShaddock-lib-deep",
19-
"haddock/ghc-boot-th-9.2.8",
20-
]
21-
elif test_ghc_version == "9.4.8":
22-
return [
23-
"haddock/array-0.5.4.0",
24-
"haddock/base-4.17.2.1",
25-
"haddock/deepseq-1.4.8.0",
26-
"haddock/ghc-bignum-1.3",
27-
"haddock/ghc-prim-0.9.1",
28-
"haddock/index",
29-
"haddock/pretty-1.1.3.6",
30-
"haddock/template-haskell-2.19.0.0",
31-
"haddock/testsZShaddockZShaddock-lib-a",
32-
"haddock/testsZShaddockZShaddock-lib-b",
33-
"haddock/testsZShaddockZShaddock-lib-deep",
34-
"haddock/ghc-boot-th-9.4.8",
35-
]
36-
elif test_ghc_version == "9.6.5":
37-
return [
38-
"haddock/array-0.5.6.0",
39-
"haddock/base-4.18.2.1",
40-
"haddock/deepseq-1.4.8.1",
41-
"haddock/ghc-bignum-1.3",
42-
"haddock/ghc-prim-0.10.0",
43-
"haddock/index",
44-
"haddock/pretty-1.1.3.6",
45-
"haddock/template-haskell-2.20.0.0",
46-
"haddock/testsZShaddockZShaddock-lib-a",
47-
"haddock/testsZShaddockZShaddock-lib-b",
48-
"haddock/testsZShaddockZShaddock-lib-deep",
49-
"haddock/ghc-boot-th-9.6.5",
50-
]
51-
elif test_ghc_version == "9.8.2" and is_nix_shell:
52-
return [
53-
"haddock/array-0.5.6.0-inplace",
54-
"haddock/base-4.19.1.0-inplace",
55-
"haddock/deepseq-1.5.0.0-inplace",
56-
"haddock/ghc-bignum-1.3-inplace",
57-
"haddock/ghc-prim-0.11.0-inplace",
58-
"haddock/index",
59-
"haddock/pretty-1.1.3.6-inplace",
60-
"haddock/template-haskell-2.21.0.0-inplace",
61-
"haddock/testsZShaddockZShaddock-lib-a",
62-
"haddock/testsZShaddockZShaddock-lib-b",
63-
"haddock/testsZShaddockZShaddock-lib-deep",
64-
"haddock/ghc-boot-th-9.8.2-inplace",
65-
]
66-
elif test_ghc_version == "9.8.2" and is_windows:
67-
return [
68-
"haddock/array-0.5.6.0-eeeb",
69-
"haddock/base-4.19.0.0-1e7d",
70-
"haddock/deepseq-1.5.0.0-940f",
71-
"haddock/ghc-bignum-1.3-7ca5",
72-
"haddock/ghc-boot-th-9.8.2-d8a4",
73-
"haddock/ghc-prim-0.11.0-6ef2",
74-
"haddock/index",
75-
"haddock/pretty-1.1.3.6-39a4",
76-
"haddock/template-haskell-2.21.0.0-9348",
77-
"haddock/testsZShaddockZShaddock-lib-a",
78-
"haddock/testsZShaddockZShaddock-lib-b",
79-
"haddock/testsZShaddockZShaddock-lib-deep",
80-
]
81-
elif test_ghc_version == "9.8.2" and is_linux:
82-
return [
83-
"haddock/array-0.5.6.0-7881",
84-
"haddock/base-4.19.1.0-179c",
85-
"haddock/deepseq-1.5.0.0-6708",
86-
"haddock/ghc-bignum-1.3-b9ac",
87-
"haddock/ghc-boot-th-9.8.2-9178",
88-
"haddock/ghc-prim-0.11.0-7523",
89-
"haddock/index",
90-
"haddock/pretty-1.1.3.6-8bb3",
91-
"haddock/template-haskell-2.21.0.0-9c7a",
92-
"haddock/testsZShaddockZShaddock-lib-a",
93-
"haddock/testsZShaddockZShaddock-lib-b",
94-
"haddock/testsZShaddockZShaddock-lib-deep",
95-
]
96-
elif test_ghc_version == "9.8.2" and is_darwin:
97-
return [
98-
"haddock/array-0.5.6.0-a13d",
99-
"haddock/base-4.19.1.0-e86d",
100-
"haddock/deepseq-1.5.0.0-8f97",
101-
"haddock/ghc-bignum-1.3-625d",
102-
"haddock/ghc-boot-th-9.8.2-c69e",
103-
"haddock/ghc-prim-0.11.0-f42f",
104-
"haddock/index",
105-
"haddock/pretty-1.1.3.6-b285",
106-
"haddock/template-haskell-2.21.0.0-4c6f",
107-
"haddock/testsZShaddockZShaddock-lib-a",
108-
"haddock/testsZShaddockZShaddock-lib-b",
109-
"haddock/testsZShaddockZShaddock-lib-deep",
110-
]
111-
elif test_ghc_version == "9.10.3":
112-
return [
113-
"haddock/array-0.5.8.0",
114-
"haddock/base-4.20.2.0",
115-
"haddock/deepseq-1.5.0.0",
116-
"haddock/ghc-bignum-1.3",
117-
"haddock/ghc-prim-0.12.0",
118-
"haddock/index",
119-
"haddock/pretty-1.1.3.6",
120-
"haddock/template-haskell-2.22.0.0",
121-
"haddock/testsZShaddockZShaddock-lib-a",
122-
"haddock/testsZShaddockZShaddock-lib-b",
123-
"haddock/testsZShaddockZShaddock-lib-deep",
124-
"haddock/ghc-boot-th-9.10.3",
125-
]
7+
def _is_version(token):
8+
if "." not in token:
9+
return False
10+
parts = token.split(".")
11+
for p in parts:
12+
if not p.isdigit():
13+
return False
14+
return True
15+
16+
def _strip_version_suffix(s):
17+
parts = s.split("-")
18+
if len(parts) < 2:
19+
return s
20+
if _is_version(parts[-1]):
21+
return "-".join(parts[:-1])
22+
if len(parts) < 3:
23+
return s
24+
if parts[-1].isalnum() and _is_version(parts[-2]):
25+
return "-".join(parts[:-2])
26+
return s
27+
28+
def _non_versioned_test_impl(ctx):
29+
env = analysistest.begin(ctx)
30+
31+
target = analysistest.target_under_test(env)
32+
33+
# Generate the proper prefix to remove from generated files.
34+
prefix_parts = []
35+
36+
if target.label.workspace_root:
37+
# Create a prefix that is correctly relative to the output of this rule.
38+
prefix_parts = ["..", strip_prefix("external/", target.label.workspace_root)]
39+
40+
if target.label.package:
41+
prefix_parts.append(target.label.package)
42+
43+
if prefix_parts:
44+
prefix = "/".join(prefix_parts) + "/"
12645
else:
127-
fail("//tests:test-haddock is missing case : (test_ghc_version={}, cpu_value={})".format(test_ghc_version, cpu_value))
46+
prefix = ""
47+
48+
generated = [
49+
_strip_version_suffix(strip_prefix(prefix, f.short_path))
50+
for f in target.files.to_list()
51+
]
52+
asserts.new_set_equals(
53+
env,
54+
sets.make(ctx.attr.generates),
55+
sets.make(generated),
56+
"Generates expected files (sans version suffix)",
57+
)
58+
59+
return analysistest.end(env)
60+
61+
non_versioned_output_test = analysistest.make(
62+
_non_versioned_test_impl,
63+
attrs = {
64+
"generates": attr.string_list(),
65+
},
66+
)

0 commit comments

Comments
 (0)