integration.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. from csv import reader
  2. from difflib import ndiff
  3. from json import loads as jloads
  4. from logging import getLogger
  5. from os import path
  6. from scriptshifter.trans import transliterate
  7. from test import TEST_DATA_DIR
  8. logger = getLogger(__name__)
  9. def test_sample(dset, report=True):
  10. """
  11. Test an individual sample set and produce a human-readable report.
  12. Used outside of automated tests.
  13. @param dset (str): sample set name (without the .csv extension) found in
  14. the `data/script_samples` directory.
  15. @param report (bool): if True (the default), print fail/success ticks and
  16. write out a report to file at the end. Otherwise, raise an exception on
  17. the first error encountered.
  18. """
  19. deltas = [] if report else None
  20. dset_fpath = path.join(TEST_DATA_DIR, "script_samples", dset + ".csv")
  21. log_fpath = path.join(TEST_DATA_DIR, "log", f"test_{dset}.log")
  22. with open(dset_fpath, newline="") as fh:
  23. csv = reader(fh)
  24. i = 1
  25. for row in csv:
  26. logger.debug(f"CSV row #{i}")
  27. lang, script, rom = row[:3]
  28. if not lang:
  29. continue
  30. t_dir = row[3] if len(row) > 3 else None
  31. opts = jloads(row[4]) if len(row) > 4 and row[4] else {}
  32. if t_dir:
  33. _trans(script, lang, t_dir, opts, rom, deltas)
  34. else:
  35. _trans(script, lang, "s2r", opts, rom, deltas)
  36. _trans(rom, lang, "r2s", opts, script, deltas)
  37. i += 1
  38. if report:
  39. with open(log_fpath, "w") as fh:
  40. # If no deltas, just truncate the file.
  41. for lang, script, delta in deltas:
  42. fh.write(f"Language: {lang}\n")
  43. fh.write(f"Original: {script}\nDiff (result vs. expected):\n")
  44. for dline in delta:
  45. fh.write(dline.strip() + "\n")
  46. fh.write("\n\n")
  47. ct = len(deltas)
  48. if ct > 0:
  49. print(f"\n\n{ct} failed tests. See report at {log_fpath}")
  50. else:
  51. print("All tests passed.")
  52. def _trans(script, lang, t_dir, opts, rom, deltas):
  53. logger.debug(f"Transliterating {lang}: {t_dir}")
  54. trans, warnings = transliterate(
  55. script, lang, t_dir=t_dir,
  56. capitalize=opts.get("capitalize"), options=opts)
  57. try:
  58. assert trans == rom
  59. except AssertionError:
  60. if deltas is not None:
  61. print("F", end="")
  62. deltas.append((lang, script, ndiff([trans], [rom])))
  63. else:
  64. raise AssertionError(f"Result: {trans}\nExpected: {rom}")
  65. else:
  66. if deltas:
  67. print(".", end="")