Skip to content

Commit 790d259

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 5a6da68 commit 790d259

File tree

2 files changed

+77
-127
lines changed

2 files changed

+77
-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: 60 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -1,127 +1,64 @@
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_semver(token):
8+
parts = token.split(".")
9+
for p in parts:
10+
if not p.isdigit():
11+
return False
12+
return True
13+
14+
def _strip_version_suffix(s):
15+
parts = s.split("-")
16+
if len(parts) < 2:
17+
return s
18+
if _is_semver(parts[-1]):
19+
return "-".join(parts[:-1])
20+
if len(parts) < 3:
21+
return s
22+
if parts[-1].isalnum() and _is_semver(parts[-2]):
23+
return "-".join(parts[:-2])
24+
return s
25+
26+
def _non_versioned_test_impl(ctx):
27+
env = analysistest.begin(ctx)
28+
29+
target = analysistest.target_under_test(env)
30+
31+
# Generate the proper prefix to remove from generated files.
32+
prefix_parts = []
33+
34+
if target.label.workspace_root:
35+
# Create a prefix that is correctly relative to the output of this rule.
36+
prefix_parts = ["..", strip_prefix("external/", target.label.workspace_root)]
37+
38+
if target.label.package:
39+
prefix_parts.append(target.label.package)
40+
41+
if prefix_parts:
42+
prefix = "/".join(prefix_parts) + "/"
12643
else:
127-
fail("//tests:test-haddock is missing case : (test_ghc_version={}, cpu_value={})".format(test_ghc_version, cpu_value))
44+
prefix = ""
45+
46+
generated = [
47+
_strip_version_suffix(strip_prefix(prefix, f.short_path))
48+
for f in target.files.to_list()
49+
]
50+
asserts.new_set_equals(
51+
env,
52+
sets.make(ctx.attr.generates),
53+
sets.make(generated),
54+
"Generates expected files (sans version suffix)",
55+
)
56+
57+
return analysistest.end(env)
58+
59+
non_versioned_output_test = analysistest.make(
60+
_non_versioned_test_impl,
61+
attrs = {
62+
"generates": attr.string_list(),
63+
},
64+
)

0 commit comments

Comments
 (0)