integration.rs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. use std::path::Path;
  2. use assert_cmd::Command;
  3. use predicates::boolean::PredicateBooleanExt;
  4. fn numbat() -> Command {
  5. let module_path = Path::new(&std::env::var_os("CARGO_MANIFEST_DIR").unwrap())
  6. .parent()
  7. .unwrap()
  8. .join("numbat")
  9. .join("modules");
  10. std::env::set_var("NUMBAT_MODULES_PATH", module_path);
  11. let mut cmd = Command::cargo_bin("numbat").unwrap();
  12. cmd.arg("--no-init");
  13. cmd.arg("--no-config");
  14. cmd
  15. }
  16. #[test]
  17. fn pass_expression_on_command_line() {
  18. numbat()
  19. .arg("--expression")
  20. .arg("2 meter + 3 meter")
  21. .assert()
  22. .success()
  23. .stdout(predicates::str::contains("5 m"));
  24. numbat()
  25. .arg("-e")
  26. .arg("let x = 2")
  27. .arg("-e")
  28. .arg("x^3")
  29. .assert()
  30. .success()
  31. .stdout(predicates::str::contains("8"));
  32. numbat()
  33. .arg("--expression")
  34. .arg("2 +/ 3")
  35. .assert()
  36. .stderr(predicates::str::contains("while parsing"));
  37. // numbat()
  38. // .arg("--expression")
  39. // .arg("2 meter + 3 second")
  40. // .assert()
  41. // .failure()
  42. // .stderr(predicates::str::contains("while type checking"));
  43. // numbat()
  44. // .arg("--expression")
  45. // .arg("1/0")
  46. // .assert()
  47. // .failure()
  48. // .stderr(predicates::str::contains("runtime error"));
  49. // numbat()
  50. // .arg("--expression")
  51. // .arg("type(2 m/s)")
  52. // .assert()
  53. // .success()
  54. // .stdout(predicates::str::contains("Length / Time"));
  55. }
  56. #[test]
  57. fn read_code_from_file() {
  58. numbat()
  59. .arg("tests/examples/pendulum.nbt")
  60. .assert()
  61. .success();
  62. numbat()
  63. .arg("tests/examples/parser_error.nbt")
  64. .assert()
  65. .failure()
  66. .stderr(predicates::str::contains("while parsing"));
  67. }
  68. #[test]
  69. fn process_code_from_file_and_cli_expression() {
  70. numbat()
  71. .arg("tests/examples/pendulum.nbt")
  72. .arg("--expression")
  73. .arg("oscillation_time(20cm)")
  74. .assert()
  75. .success();
  76. // numbat()
  77. // .arg("tests/examples/pendulum.nbt")
  78. // .arg("--expression")
  79. // .arg("oscillation_time(20kg)")
  80. // .assert()
  81. // .failure()
  82. // .stderr(predicates::str::contains("while type checking"));
  83. }
  84. #[test]
  85. fn print_calls() {
  86. numbat()
  87. .arg("tests/examples/print.nbt")
  88. .assert()
  89. .success()
  90. .stdout(predicates::str::contains(
  91. "1\n2 m\nhello world\npi = 3.14159\n1 + 2 = 3\n",
  92. ));
  93. }
  94. #[test]
  95. fn without_prelude() {
  96. numbat()
  97. .arg("--no-prelude")
  98. .arg("--expression")
  99. .arg("2.1 + 3.1")
  100. .assert()
  101. .success()
  102. .stdout(predicates::str::contains("5.2"));
  103. numbat()
  104. .arg("--no-prelude")
  105. .arg("--expression")
  106. .arg("1 meter")
  107. .assert()
  108. .failure()
  109. .stderr(predicates::str::contains("unknown identifier"));
  110. }
  111. // #[test]
  112. // fn pretty_printing() {
  113. // numbat()
  114. // .arg("--pretty-print=always")
  115. // .arg("--expression")
  116. // .arg("let v=30km/h")
  117. // .assert()
  118. // .success()
  119. // .stdout(predicates::str::contains(
  120. // "let v: Velocity = 30 kilometre / hour",
  121. // ));
  122. // }
  123. #[test]
  124. fn help_text() {
  125. numbat()
  126. .write_stdin("help")
  127. .assert()
  128. .success()
  129. .stdout(predicates::str::contains(
  130. "Energy of red photons: 1.87855 eV",
  131. ));
  132. }
  133. #[test]
  134. fn info_text() {
  135. numbat().write_stdin("info g0").assert().success().stdout(
  136. predicates::str::contains("Standard acceleration of gravity on earth")
  137. .and(predicates::str::contains("9.80665 m/s²")),
  138. );
  139. numbat().write_stdin("info C").assert().success().stdout(
  140. predicates::str::contains("Coulomb").and(predicates::str::contains("1 coulomb = ")),
  141. );
  142. numbat()
  143. .write_stdin("info round")
  144. .assert()
  145. .success()
  146. .stdout(
  147. predicates::str::contains("Round")
  148. .and(predicates::str::contains("Round to the nearest integer.")),
  149. );
  150. }