blob: ee7963719e1e21f074af91ea8b74d24fe964a207 [file] [log] [blame]
Han-Wen Nienhuys4bc6c802016-04-01 20:27:52 +02001# skylark rule to generate a Junit4 TestSuite
2# Assumes srcs are all .java Test files
3# Assumes junit4 is already added to deps by the user.
4
5# See https://github.com/bazelbuild/bazel/issues/1017 for background.
6
7_OUTPUT = """import org.junit.runners.Suite;
8import org.junit.runner.RunWith;
9
10@RunWith(Suite.class)
11@Suite.SuiteClasses({%s})
12public class %s {}
13"""
14
15_PREFIXES = ("org", "com", "edu")
16
17def _SafeIndex(l, val):
18 for i, v in enumerate(l):
19 if val == v:
20 return i
21 return -1
22
23def _AsClassName(fname):
24 fname = [x.path for x in fname.files][0]
25 toks = fname[:-5].split("/")
26 findex = -1
27 for s in _PREFIXES:
28 findex = _SafeIndex(toks, s)
29 if findex != -1:
30 break
31 if findex == -1:
32 fail("%s does not contain any of %s",
33 fname, _PREFIXES)
34 return ".".join(toks[findex:]) + ".class"
35
36def _impl(ctx):
37 classes = ",".join(
38 [_AsClassName(x) for x in ctx.attr.srcs])
39 ctx.file_action(output=ctx.outputs.out, content=_OUTPUT % (
40 classes, ctx.attr.outname))
41
42_GenSuite = rule(
43 attrs = {
44 "srcs": attr.label_list(allow_files = True),
45 "outname": attr.string(),
46 },
47 outputs = {"out": "%{name}.java"},
48 implementation = _impl,
49)
50
51def junit_tests(name, srcs, **kwargs):
52 s_name = name + "TestSuite"
53 j_name = s_name + ".java",
54 _GenSuite(name=s_name,
55 srcs=srcs,
56 outname=s_name)
57 native.java_test(name=name,
58 test_class=s_name,
59 srcs = srcs + [":"+s_name],
60 **kwargs)