/src/etc/combine-tests.py

http://github.com/jruderman/rust · Python · 70 lines · 56 code · 10 blank · 4 comment · 15 complexity · 85c06a891d1d1b1341be1792367f946c MD5 · raw file

  1. #!/usr/bin/env python
  2. # this combines all the working run-pass tests into a single large crate so we
  3. # can run it "fast": spawning zillions of windows processes is our major build
  4. # bottleneck (and it doesn't hurt to run faster on other platforms as well).
  5. import sys, os, re, codecs
  6. def scrub(b):
  7. if sys.version_info >= (3,) and type(b) == bytes:
  8. return b.decode('ascii')
  9. else:
  10. return b
  11. src_dir = scrub(os.getenv("CFG_SRC_DIR"))
  12. if not src_dir:
  13. raise Exception("missing env var CFG_SRC_DIR")
  14. run_pass = os.path.join(src_dir, "src", "test", "run-pass")
  15. run_pass = os.path.abspath(run_pass)
  16. stage2_tests = []
  17. take_args = {}
  18. for t in os.listdir(run_pass):
  19. if t.endswith(".rs") and not (
  20. t.startswith(".") or t.startswith("#") or t.startswith("~")):
  21. f = codecs.open(os.path.join(run_pass, t), "r", "utf8")
  22. s = f.read()
  23. if not ("xfail-test" in s or
  24. "xfail-fast" in s or
  25. "xfail-win32" in s):
  26. stage2_tests.append(t)
  27. if "main(args: ~[~str])" in s:
  28. take_args[t] = True
  29. f.close()
  30. stage2_tests.sort()
  31. c = open("tmp/run_pass_stage2.rc", "w")
  32. i = 0
  33. c.write("// AUTO-GENERATED FILE: DO NOT EDIT\n")
  34. c.write("#[link(name=\"run_pass_stage2\", vers=\"0.1\")];\n")
  35. for t in stage2_tests:
  36. p = os.path.join(run_pass, t)
  37. p = p.replace("\\", "\\\\")
  38. c.write("#[path = \"%s\"]" % p);
  39. c.write("mod t_%d;\n" % i)
  40. i += 1
  41. c.close()
  42. d = open("tmp/run_pass_stage2_driver.rs", "w")
  43. d.write("// AUTO-GENERATED FILE: DO NOT EDIT\n")
  44. d.write("use std;\n")
  45. d.write("use run_pass_stage2;\n")
  46. d.write("import run_pass_stage2::*;\n")
  47. d.write("import io::writer_util;\n");
  48. d.write("fn main() {\n");
  49. d.write(" let out = io::stdout();\n");
  50. i = 0
  51. for t in stage2_tests:
  52. p = os.path.join("test", "run-pass", t)
  53. p = p.replace("\\", "\\\\")
  54. d.write(" out.write_str(~\"run-pass [stage2]: %s\\n\");\n" % p)
  55. if t in take_args:
  56. d.write(" t_%d::main(~[~\"arg0\"]);\n" % i)
  57. else:
  58. d.write(" t_%d::main();\n" % i)
  59. i += 1
  60. d.write("}\n")