| Han-Wen Nienhuys | 4bc6c80 | 2016-04-01 20:27:52 +0200 | [diff] [blame^] | 1 | # 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; |
| 8 | import org.junit.runner.RunWith; |
| 9 | |
| 10 | @RunWith(Suite.class) |
| 11 | @Suite.SuiteClasses({%s}) |
| 12 | public class %s {} |
| 13 | """ |
| 14 | |
| 15 | _PREFIXES = ("org", "com", "edu") |
| 16 | |
| 17 | def _SafeIndex(l, val): |
| 18 | for i, v in enumerate(l): |
| 19 | if val == v: |
| 20 | return i |
| 21 | return -1 |
| 22 | |
| 23 | def _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 | |
| 36 | def _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 | |
| 51 | def 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) |