diff --git a/Rules/Languages/pl/ClearSpeak_Rules.yaml b/Rules/Languages/pl/ClearSpeak_Rules.yaml
index dfcea2e0..5e6cca14 100644
--- a/Rules/Languages/pl/ClearSpeak_Rules.yaml
+++ b/Rules/Languages/pl/ClearSpeak_Rules.yaml
@@ -631,36 +631,59 @@
- LineCount: "count(*[not(contains(@data-intent-property, ':continued-row:'))])"
- NextLineIsContinuedRow: "false()" # default value
- IsColumnSilent: true()
+ # Polish plural declension category of $LineCount: singular (1), paucal (2-4
+ # except 12-14 -> nominative plural), otherwise genitive plural.
+ - Paucal: "($LineCount mod 10 = 2 or $LineCount mod 10 = 3 or $LineCount mod 10 = 4) and not($LineCount mod 100 = 12 or $LineCount mod 100 = 13 or $LineCount mod 100 = 14)"
+ - IsCase: "($ClearSpeak_MultiLineLabel = 'Auto' and self::m:piecewise) or $ClearSpeak_MultiLineLabel = 'Case'"
+ - IsLine: "not($IsCase) and ($ClearSpeak_MultiLineLabel = 'Auto' or $ClearSpeak_MultiLineLabel = 'Line' or $ClearSpeak_MultiLineLabel = 'None')"
replace:
- test:
- if: "$ClearSpeak_MultiLineOverview = 'Auto'"
then:
- x: "$LineCount"
- test:
- - if: "$LineCount != 1 and (($ClearSpeak_MultiLineLabel = 'Auto' and self::m:piecewise) or $ClearSpeak_MultiLineLabel = 'Case')"
- then: [t: "przypadki"] # phrase(this is the first 'case' of three cases)
- - else_if: "$LineCount != 1 and ($ClearSpeak_MultiLineLabel = 'Auto' or $ClearSpeak_MultiLineLabel = 'Line' or $ClearSpeak_MultiLineLabel = 'None')"
- then: [t: "linie"] # phrase(this is the first 'line' of three lines)
- - else_if: "$LineCount != 1 and $ClearSpeak_MultiLineLabel = 'Constraint'"
- then: [t: "warunki"] # phrase(this is the first 'constraint' of three constraints)
- - else_if: "$LineCount != 1 and $ClearSpeak_MultiLineLabel = 'Equation'"
- then: [t: "równania"] # phrase(this is the first 'equation' of three equations)
- - else_if: "$LineCount != 1 and $ClearSpeak_MultiLineLabel = 'Row'"
- then: [T: "wiersze"] # phrase(this is the first 'row' of three rows)
- - else_if: "$LineCount != 1 and $ClearSpeak_MultiLineLabel = 'Step'"
- then: [t: "kroki"] # phrase(this is the first 'step' of three steps)
- - else_if: "($ClearSpeak_MultiLineLabel = 'Auto' and self::m:piecewise) or $ClearSpeak_MultiLineLabel = 'Case'"
- then: [t: "przypadek"] # phrase(this is the first 'case' of three cases)
- - else_if: "$ClearSpeak_MultiLineLabel = 'Auto' or $ClearSpeak_MultiLineLabel = 'Line' or $ClearSpeak_MultiLineLabel = 'None'" # already dealt with Auto/Case
- then: [t: "linia"] # phrase(this is the first 'line' of three lines)
+ - if: "$IsCase"
+ then_test:
+ - if: "$LineCount = 1"
+ then: [t: "przypadek"] # phrase(this is the first 'case' of three cases)
+ - else_if: "$Paucal"
+ then: [t: "przypadki"] # phrase(there are 'two cases' to consider)
+ else: [t: "przypadków"] # phrase(there are 'five cases' to consider)
+ - else_if: "$IsLine"
+ then_test:
+ - if: "$LineCount = 1"
+ then: [t: "linia"] # phrase(this is the first 'line' of three lines)
+ - else_if: "$Paucal"
+ then: [t: "linie"] # phrase(there are 'two lines' shown)
+ else: [t: "linii"] # phrase(there are 'five lines' shown)
- else_if: "$ClearSpeak_MultiLineLabel = 'Constraint'"
- then: [t: "warunek"] # phrase(this is the first 'constraint' of three constraints)
+ then_test:
+ - if: "$LineCount = 1"
+ then: [t: "warunek"] # phrase(this is the first 'constraint' of three constraints)
+ - else_if: "$Paucal"
+ then: [t: "warunki"] # phrase(there are 'two constraints' to satisfy)
+ else: [t: "warunków"] # phrase(there are 'five constraints' to satisfy)
- else_if: "$ClearSpeak_MultiLineLabel = 'Equation'"
- then: [t: "równanie"] # phrase(this is the first 'equation' of three equations)
+ then_test:
+ - if: "$LineCount = 1"
+ then: [t: "równanie"] # phrase(this is the first 'equation' of three equations)
+ - else_if: "$Paucal"
+ then: [t: "równania"] # phrase(there are 'two equations' to solve)
+ else: [t: "równań"] # phrase(there are 'five equations' to solve)
- else_if: "$ClearSpeak_MultiLineLabel = 'Row'"
- then: [T: "wiersz"] # phrase(this is the first 'row' of three rows)
+ then_test:
+ - if: "$LineCount = 1"
+ then: [T: "wiersz"] # phrase(this is the first 'row' of three rows)
+ - else_if: "$Paucal"
+ then: [T: "wiersze"] # phrase(there are 'two rows' shown)
+ else: [T: "wierszy"] # phrase(there are 'five rows' shown)
- else_if: "$ClearSpeak_MultiLineLabel = 'Step'"
- then: [t: "krok"] # phrase(this is the first 'step' of three steps)
+ then_test:
+ - if: "$LineCount = 1"
+ then: [t: "krok"] # phrase(this is the first 'step' of three steps)
+ - else_if: "$Paucal"
+ then: [t: "kroki"] # phrase(there are 'two steps' to follow)
+ else: [t: "kroków"] # phrase(there are 'five steps' to follow)
# else 'None -- don't say anything'
- pause: short
- x: "*"
diff --git a/Rules/Languages/pl/SharedRules/general.yaml b/Rules/Languages/pl/SharedRules/general.yaml
index d1a2d103..40e996f4 100644
--- a/Rules/Languages/pl/SharedRules/general.yaml
+++ b/Rules/Languages/pl/SharedRules/general.yaml
@@ -544,15 +544,32 @@
- IsColumnSilent: true()
replace:
- x: "$LineCount"
+ # Polish plural declension of the counted noun: 1 -> singular; 2-4 (but not
+ # 12-14) -> paucal; otherwise genitive plural. Applied per row-type.
- test:
- - if: "self::m:piecewise"
- then: [t: "przypadek"] # phrase(this is the first 'case' of three cases)
- - else_if: "self::m:system-of-equations"
- then: [t: "równanie"] # phrase(this is the first 'equation' of three equations)
- else: [t: "linia"] # phrase(this is the first 'line' of three lines)
- - test:
- - if: "$LineCount != 1"
- then: [ct: "s"] # plural
+ - if: "$LineCount = 1"
+ then:
+ - test:
+ - if: "self::m:piecewise"
+ then: [t: "przypadek"] # phrase(this is the first 'case' of three cases)
+ - else_if: "self::m:system-of-equations"
+ then: [t: "równanie"] # phrase(this is the first 'equation' of three equations)
+ else: [t: "linia"] # phrase(this is the first 'line' of three lines)
+ - else_if: "($LineCount mod 10 = 2 or $LineCount mod 10 = 3 or $LineCount mod 10 = 4) and not($LineCount mod 100 = 12 or $LineCount mod 100 = 13 or $LineCount mod 100 = 14)"
+ then:
+ - test:
+ - if: "self::m:piecewise"
+ then: [t: "przypadki"] # phrase(there are 'two cases' to consider)
+ - else_if: "self::m:system-of-equations"
+ then: [t: "równania"] # phrase(there are 'two equations' to solve)
+ else: [t: "linie"] # phrase(there are 'two lines' shown)
+ - else:
+ - test:
+ - if: "self::m:piecewise"
+ then: [t: "przypadków"] # phrase(there are 'five cases' to consider)
+ - else_if: "self::m:system-of-equations"
+ then: [t: "równań"] # phrase(there are 'five equations' to solve)
+ else: [t: "linii"] # phrase(there are 'five lines' shown)
- pause: short
- x: "*"
- pause: long
diff --git a/tests/Languages/pl.rs b/tests/Languages/pl.rs
index 677d4dc2..44016ff5 100644
--- a/tests/Languages/pl.rs
+++ b/tests/Languages/pl.rs
@@ -1,3 +1,35 @@
#![allow(non_snake_case)]
-mod pl;
\ No newline at end of file
+// Existing hand-written Polish tests (norms, degrees, relations, etc.)
+mod pl;
+
+// Tests mirrored from the English suite, with expected speech localized to Polish.
+mod ClearSpeak {
+ mod functions;
+ mod large_ops;
+ mod menclose;
+ mod mfrac;
+ mod mroot;
+ mod msup;
+ mod sets;
+ mod symbols_and_adornments;
+ mod multiline;
+}
+
+mod SimpleSpeak {
+ mod functions;
+ mod large_ops;
+ mod mfrac;
+ mod msup;
+ mod sets;
+ mod geometry;
+ mod linear_algebra;
+ mod multiline;
+ mod subscripts;
+}
+mod shared;
+mod units;
+mod chemistry;
+mod alphabets;
+mod definitions;
+mod mtable;
diff --git a/tests/Languages/pl/ClearSpeak/functions.rs b/tests/Languages/pl/ClearSpeak/functions.rs
new file mode 100644
index 00000000..66216dfb
--- /dev/null
+++ b/tests/Languages/pl/ClearSpeak/functions.rs
@@ -0,0 +1,569 @@
+/// Tests for:
+/// * functions including trig functions, logs, and functions to powers
+/// * implied times/functional call and explicit times/function call
+/// * parens
+/// These are all intertwined, so they are in one file
+use crate::common::*;
+use anyhow::Result;
+
+#[test]
+fn trig_names() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "sinus x plus cosinus y plus tangens z plus sekans alfa, plus kosekans fi, plus cotangens fi")?;
+ return Ok(());
+
+}
+
+#[test]
+fn hyperbolic_trig_names() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "sinus hiperboliczny z x, plus cosinus hiperboliczny z y, plus tangens hiperboliczny z z, plus sekans hiperboliczny z alfa, plus kosekans hiperboliczny z fi, plus cotangens hiperboliczny z fi")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn inverse_trig() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "odwrotność sinus z x")?;
+ return Ok(());
+
+}
+
+#[test]
+fn inverse_trig_trig_inverse() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_Trig", "TrigInverse",expr,
+ "tangens odwrotność z x")?;
+ return Ok(());
+
+}
+
+#[test]
+fn inverse_trig_arc() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_Trig", "ArcTrig",expr,
+ "łuk cosinus hiperboliczny z x")?;
+ return Ok(());
+
+}
+
+#[test]
+fn trig_squared() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "sinus do kwadratu z x")?;
+ return Ok(());
+
+}
+
+#[test]
+fn trig_cubed() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "tangens do sześcianu z x")?;
+ return Ok(());
+
+}
+
+#[test]
+fn trig_fourth() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "sekans do potęgi czwartej, z x")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn trig_power_other() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "sinus hiperboliczny do potęgi n minus 1, z x")?;
+ return Ok(());
+
+}
+
+#[test]
+fn simple_log() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "logarytm x")?;
+ return Ok(());
+
+}
+
+#[test]
+fn principal_value_log() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "Log z z")?;
+ return Ok(());
+
+}
+
+#[test]
+fn normal_log() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "logarytm z, nawias otwierający, x plus y, nawias zamykający")?;
+ return Ok(());
+
+}
+
+#[test]
+fn simple_log_with_base() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "logarytm o podstawie b, z x")?;
+ return Ok(());
+
+}
+
+#[test]
+fn normal_log_with_base() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "logarytm o podstawie b, z, nawias otwierający, x plus y, nawias zamykający")?;
+ return Ok(());
+
+}
+
+#[test]
+fn simple_ln() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "l n x")?;
+ return Ok(());
+
+}
+
+#[test]
+fn normal_ln() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "l n z, nawias otwierający, x plus y, nawias zamykający")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn simple_natural_log() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_Log", "LnAsNaturalLog",expr,
+ "logarytm naturalny x")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn natural_log() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_Log", "LnAsNaturalLog",expr,
+ "logarytm naturalny z, nawias otwierający, x plus y, nawias zamykający")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn explicit_function_call_with_parens() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "t z x")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn explicit_times_with_parens() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "t razy x")?;
+ return Ok(());
+
+}
+
+#[test]
+fn explicit_function_call() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "t z x")?;
+ return Ok(());
+
+}
+
+#[test]
+fn explicit_times() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "t x")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn test_functions_none_pref() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_Functions", "None",expr,
+ "logarytm z, nawias otwierający, x plus y, nawias zamykający; plus; f razy, nawias otwierający, x plus y, nawias zamykający")?;
+ return Ok(());
+
+}
+
+#[test]
+fn test_functions_none_pref_multiple_args() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_Functions", "None",expr,
+ "wielka b razy, nawias otwierający, 2 przecinek, 6, nawias zamykający")?;
+ return Ok(());
+
+}
+
+
+/*
+ * Tests for times
+ */
+#[test]
+fn no_times_binomial() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "x y")?;
+ return Ok(());
+
+}
+
+#[test]
+fn times_following_paren() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "2 razy 3")?;
+ return Ok(());
+
+}
+
+#[test]
+fn times_preceding_paren() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "2 razy 3")?;
+ return Ok(());
+
+}
+
+#[test]
+fn times_sqrt() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "pierwiastek kwadratowy z a; razy pierwiastek kwadratowy z b; równa się, pierwiastek kwadratowy z a b")?;
+ return Ok(());
+
+}
+
+#[test]
+fn more_implied_times() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_ImpliedTimes", "MoreImpliedTimes",expr,
+ "nawias otwierający, 2 razy x, nawias zamykający do kwadratu")?;
+ return Ok(());
+
+}
+
+#[test]
+fn explicit_times_more_implied_times() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_ImpliedTimes", "MoreImpliedTimes",expr, "t razy x")?;
+ return Ok(());
+
+}
+
+#[test]
+fn explicit_times_none_simple_right() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_ImpliedTimes", "None",
+ expr, "2, nawias kwadratowy otwierający 3 nawias kwadratowy zamykający")?;
+ return Ok(());
+
+}
+
+#[test]
+fn explicit_times_none_simple_left() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_ImpliedTimes", "None",
+ expr, "nawias otwierający, 2 minus 1, nawias zamykający; x")?;
+ return Ok(());
+
+}
+
+#[test]
+fn explicit_times_none_superscript() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak_prefs("pl",
+ vec![("ClearSpeak_ImpliedTimes", "None"), ("ClearSpeak_Functions", "None")],
+ expr, "f, nawias otwierający x nawias zamykający; równa się; x do kwadratu, nawias otwierający, x plus 1, nawias zamykający")?;
+ return Ok(());
+
+}
+
+/*
+ * Tests for parens
+ */
+ #[test]
+ fn no_parens_number() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "25 razy x")?;
+ return Ok(());
+
+ }
+
+ #[test]
+ fn no_parens_monomial() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "b, nawias otwierający, x y nawias zamykający")?;
+ return Ok(());
+
+ }
+
+ #[test]
+ fn no_parens_negative_number() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "2 plus minus 2")?;
+ return Ok(());
+
+ }
+
+
+ #[test]
+ fn no_parens_negative_number_with_var() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "minus 2 x plus 1")?;
+ return Ok(());
+
+ }
+
+ #[test]
+ fn parens_superscript() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "nawias otwierający, 2 x nawias zamykający do kwadratu")?;
+ return Ok(());
+
+ }
+
+ #[test]
+ fn no_parens_fraction() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "2 plus jedna druga")?;
+ return Ok(());
+
+ }
+
+
+ // Tests for the ten types of intervals in ClearSpeak
+ #[test]
+ fn parens_interval_open_open() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_Paren", "Interval",expr,
+ "przedział otwarty od c do d")?;
+ return Ok(());
+
+}
+
+#[test]
+ fn parens_interval_closed_open() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_Paren", "Interval ",expr,
+ "przedział lewostronnie domknięty prawostronnie otwarty od c do d")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn parens_interval_open_closed() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_Paren", "Interval ",expr,
+ "przedział lewostronnie otwarty prawostronnie domknięty od c do d")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn parens_interval_closed_closed() -> Result<()> {
+ let expr = "";
+test_ClearSpeak("pl", "ClearSpeak_Paren", "Interval ",expr,
+"przedział domknięty od c do d")?;
+return Ok(());
+
+}
+
+ #[test]
+ fn parens_interval_neg_infinity_open_open() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_Paren", "Interval ",expr,
+ "przedział otwarty od minus nieskończoność do d")?;
+ return Ok(());
+
+}
+
+ #[test]
+ fn parens_interval_neg_infinity_closed_open() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_Paren", "Interval ",expr,
+ "przedział lewostronnie otwarty prawostronnie domknięty od minus nieskończoność do d")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn parens_interval_open_open_infinity() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_Paren", "Interval ",expr,
+ "przedział otwarty od c do nieskończoność")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn parens_interval_closed_open_infinity() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_Paren", "Interval ",expr,
+"przedział lewostronnie domknięty prawostronnie otwarty od c do nieskończoność")?;
+return Ok(());
+
+}
+
+#[test]
+fn parens_interval_neg_infinity_to_infinity() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_Paren", "Interval ",expr,
+ "przedział otwarty od minus nieskończoność do nieskończoność")?;
+ return Ok(());
+
+}
+
+#[test]
+fn parens_interval_neg_infinity_to_pos_infinity() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_Paren", "Interval ",expr,
+ "przedział otwarty od minus nieskończoność do plus nieskończoność")?;
+ return Ok(());
+
+}
diff --git a/tests/Languages/pl/ClearSpeak/large_ops.rs b/tests/Languages/pl/ClearSpeak/large_ops.rs
new file mode 100644
index 00000000..edc0bbb7
--- /dev/null
+++ b/tests/Languages/pl/ClearSpeak/large_ops.rs
@@ -0,0 +1,235 @@
+use crate::common::*;
+use anyhow::Result;
+
+#[test]
+fn sum_both() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "suma od n równa się 1, do 10; n")?;
+ return Ok(());
+
+}
+
+#[test]
+fn sum_under() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "suma przez wielka s z i")?;
+ return Ok(());
+
+}
+#[test]
+fn sum_both_msubsup() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "suma od n równa się 1, do 10; n")?;
+ return Ok(());
+
+}
+
+#[test]
+fn sum_sub() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "suma przez wielka s z i")?;
+ return Ok(());
+
+}
+
+#[test]
+fn sum() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "suma, a indeks dolny i")?;
+ return Ok(());
+
+}
+
+#[test]
+fn product_both() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "iloczyn od n równa się 1, do 10; n")?;
+ return Ok(());
+
+}
+
+#[test]
+fn product_under() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "iloczyn przez wielka s z i")?;
+ return Ok(());
+
+}
+
+#[test]
+fn product() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "iloczyn, a indeks dolny i")?;
+ return Ok(());
+
+}
+
+#[test]
+fn intersection_both() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "przecięcie od i równa się 1, do 10; wielka s indeks dolny i")?;
+ return Ok(());
+
+}
+
+#[test]
+fn intersection_under() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "przecięcie przez wielka c z, wielka s indeks dolny i")?;
+ return Ok(());
+
+}
+
+#[test]
+fn intersection() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "przecięcie, wielka s indeks dolny i")?;
+ return Ok(());
+
+}
+
+#[test]
+fn union_both() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "suma zbiorów od i równa się 1, do 10; wielka s indeks dolny i")?;
+ return Ok(());
+
+}
+
+#[test]
+fn union_under() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "suma zbiorów przez wielka c z, wielka s indeks dolny i")?;
+ return Ok(());
+
+}
+
+#[test]
+fn union() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "suma zbiorów, wielka s indeks dolny i")?;
+ return Ok(());
+
+}
+
+#[test]
+fn integral_both() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "całka od 0, do 1; f z x; d x")?;
+ return Ok(());
+
+}
+
+#[test]
+fn integral_under() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "całka przez liczby rzeczywiste z; f z x d x")?;
+ return Ok(());
+
+}
+
+#[test]
+fn integral() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "całka, f z x d x")?;
+ return Ok(());
+
+}
\ No newline at end of file
diff --git a/tests/Languages/pl/ClearSpeak/menclose.rs b/tests/Languages/pl/ClearSpeak/menclose.rs
new file mode 100644
index 00000000..7c676217
--- /dev/null
+++ b/tests/Languages/pl/ClearSpeak/menclose.rs
@@ -0,0 +1,242 @@
+use crate::common::*;
+use anyhow::Result;
+
+#[test]
+fn menclose_actuarial() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "symbol aktuarialny, obejmujący 3 plus 2 i koniec obramowania")?;
+ return Ok(());
+
+}
+
+#[test]
+fn menclose_box() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "ramka, okrąg, obejmujący 3 plus 2 i koniec obramowania")?;
+ return Ok(());
+
+}
+
+#[test]
+fn menclose_left() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "linia na lewo, obejmujący 3 drugie koniec obramowania")?;
+ return Ok(());
+
+}
+
+#[test]
+fn menclose_right() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "linia na prawo, obejmujący 3 drugie koniec obramowania")?;
+ return Ok(());
+
+}
+
+#[test]
+fn menclose_top_bottom() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "linia na góra, dół, obejmujący 3 drugie koniec obramowania")?;
+ return Ok(());
+
+}
+
+#[test]
+fn menclose_updiagonalstrike() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "ukośnie w górę, krzyż na zewnątrz, obejmujący 3 drugie koniec obramowania")?;
+ return Ok(());
+
+}
+
+#[test]
+fn menclose_downdiagonalstrike() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "ukośnie w dół, krzyż na zewnątrz, obejmujący 3 drugie koniec obramowania")?;
+ return Ok(());
+
+}
+
+#[test]
+fn menclose_cross_out() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "x, krzyż na zewnątrz, obejmujący 3 drugie koniec obramowania")?;
+ return Ok(());
+
+}
+
+#[test]
+fn menclose_vertical_horizontal_strike() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "pionowy, poziomy, krzyż na zewnątrz, obejmujący 3 drugie koniec obramowania")?;
+ return Ok(());
+
+}
+
+#[test]
+fn menclose_leftarrow() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "strzałka w lewo, obejmujący 3 drugie koniec obramowania")?;
+ return Ok(());
+
+}
+
+#[test]
+fn menclose_right_up_down_arrow() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "strzałka w górę, strzałka w dół, strzałka w prawo, obejmujący 3 drugie koniec obramowania")?;
+ return Ok(());
+
+}
+
+#[test]
+fn menclose_northeastarrow() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "strzałka na północny wschód, obejmujący 3 drugie koniec obramowania")?;
+ return Ok(());
+
+}
+
+#[test]
+fn menclose_other_single_arrows() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "strzałka na południowy wschód, strzałka na południowy zachód, strzałka na północny zachód, obejmujący 3 drugie koniec obramowania")?;
+ return Ok(());
+
+}
+
+#[test]
+fn menclose_northwestsoutheastarrow() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "strzałka dwukierunkowa ukośna w dół, obejmujący 3 drugie koniec obramowania")?;
+ return Ok(());
+
+}
+
+#[test]
+fn menclose_other_double_arrows() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "strzałka dwukierunkowa pionowa, strzałka dwukierunkowa pozioma, strzałka dwukierunkowa ukośna w górę, obejmujący 3 drugie koniec obramowania")?;
+ return Ok(());
+
+}
+
+#[test]
+fn menclose_madrub() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "arabski symbol silni, obejmujący 3 drugie koniec obramowania")?;
+ return Ok(());
+
+}
+
+#[test]
+fn menclose_phasorangle() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "kąt fazowy, obejmujący 3 drugie koniec obramowania")?;
+ return Ok(());
+
+}
+
+#[test]
+fn menclose_circle_phasorangle() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "okrąg, kąt fazowy, obejmujący 3 drugie koniec obramowania")?;
+ return Ok(());
+
+}
+
+#[test]
+fn menclose_longdiv() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "znak dzielenia pisemnego, obejmujący 3 drugie koniec obramowania")?;
+ return Ok(());
+
+}
+
+#[test]
+fn menclose_longdiv_default() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "znak dzielenia pisemnego, obejmujący 3 drugie koniec obramowania")?;
+ return Ok(());
+
+}
+
+#[test]
+fn menclose_longdiv_empty_string() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "znak dzielenia pisemnego, obejmujący 3 drugie koniec obramowania")?;
+ return Ok(());
+
+}
+
+#[test]
+fn menclose_longdiv_whitespace_string() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "znak dzielenia pisemnego, obejmujący 3 drugie koniec obramowania")?;
+ return Ok(());
+
+}
+
+#[test]
+fn menclose_radical() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "pierwiastek kwadratowy, obejmujący 3 drugie koniec obramowania")?;
+ return Ok(());
+
+}
+
+#[test]
+fn simple_speak_menclose_top_bottom() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "linia na góra, dół, obejmujący 3 drugie koniec obramowania")?;
+ return Ok(());
+
+}
diff --git a/tests/Languages/pl/ClearSpeak/mfrac.rs b/tests/Languages/pl/ClearSpeak/mfrac.rs
new file mode 100644
index 00000000..f7197bcb
--- /dev/null
+++ b/tests/Languages/pl/ClearSpeak/mfrac.rs
@@ -0,0 +1,313 @@
+/// Tests for fractions
+/// includes simple fractions and more complex fractions
+/// also tests mixed fractions (implicit and explicit)
+use crate::common::*;
+use anyhow::Result;
+
+#[test]
+fn common_fraction_half() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "jedna druga")?;
+ return Ok(());
+
+}
+
+#[test]
+fn common_fraction_thirds() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "dwie trzecie")?;
+ return Ok(());
+
+}
+
+#[test]
+fn common_fraction_tenths() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "Auto")], expr, "17 dziesiąte")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "Ordinal")], expr, "17 dziesiąte")?;
+ return Ok(());
+
+}
+
+#[test]
+#[allow(non_snake_case)]
+fn not_ClearSpeak_common_fraction_tenths() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "Auto")], expr, "89 przez 10")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "Ordinal")], expr, "89 dziesiąte")?;
+ return Ok(());
+
+}
+
+#[test]
+fn non_simple_fraction() -> Result<()> {
+ let expr = "
+ ";
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "Auto")], expr, "ułamek z licznikiem; x plus y; i mianownikiem x minus y")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "Ordinal")], expr, "ułamek z licznikiem; x plus y; i mianownikiem x minus y")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "Over")], expr, "x plus y przez x minus y")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "FracOver")], expr, "ułamek x plus y przez x minus y")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "General")], expr, "ułamek z licznikiem; x plus y; i mianownikiem x minus y")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "EndFrac")], expr, "ułamek z licznikiem; x plus y; i mianownikiem x minus y; koniec ułamka")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "GeneralEndFrac")], expr, "ułamek z licznikiem; x plus y; i mianownikiem x minus y; koniec ułamka")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "OverEndFrac")], expr, "x plus y przez x minus y, koniec ułamka")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "Per")], expr, "x plus y na x minus y")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Verbose"),("ClearSpeak_Fractions", "Auto")], expr, "ułamek z licznikiem; x plus y; i mianownikiem x minus y; koniec ułamka")?;
+ return Ok(());
+
+}
+
+#[test]
+fn frac_with_units() -> Result<()> {
+ let expr = "
+ ";
+ test("pl", "ClearSpeak", expr, "62 milas na godzina")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn mixed_number() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "3 i jedna druga")?;
+ return Ok(());
+
+}
+
+#[test]
+fn explicit_mixed_number() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "3 i jedna ósma")?;
+ return Ok(());
+
+}
+
+#[test]
+fn mixed_number_big() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "3 i 7 przez 83")?;
+ return Ok(());
+
+}
+
+#[test]
+fn simple_text() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "rise przez run")?;
+ return Ok(());
+
+}
+
+#[test]
+fn number_and_text() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "2 miles przez 3 gallons")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn nested_simple_fractions() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "ClearSpeak", vec![("ClearSpeak_Fractions", "Auto")], expr, "jedna druga przez dwie trzecie")?;
+ test_prefs("pl", "ClearSpeak", vec![("ClearSpeak_Fractions", "Ordinal")], expr, "jedna druga przez dwie trzecie")?;
+ test_prefs("pl", "ClearSpeak", vec![("ClearSpeak_Fractions", "Over")], expr, "1 przez 2 przez 2 przez 3")?;
+ test_prefs("pl", "ClearSpeak", vec![("ClearSpeak_Fractions", "FracOver")], expr,
+ "ułamek ułamek 1 przez 2 przez ułamek 2 przez 3")?;
+ test_prefs("pl", "ClearSpeak", vec![("ClearSpeak_Fractions", "General")], expr,
+ "ułamek z licznikiem ułamek z licznikiem 1; i mianownikiem 2; i mianownikiem ułamek z licznikiem 2; i mianownikiem 3")?;
+ test_prefs("pl", "ClearSpeak", vec![("ClearSpeak_Fractions", "EndFrac")], expr, "jedna druga przez dwie trzecie")?;
+ test_prefs("pl", "ClearSpeak", vec![("ClearSpeak_Fractions", "GeneralEndFrac")], expr,
+ "ułamek z licznikiem ułamek z licznikiem 1; i mianownikiem 2; koniec ułamka; i mianownikiem ułamek z licznikiem 2; i mianownikiem 3; koniec ułamka; koniec ułamka")?;
+ test_prefs("pl", "ClearSpeak", vec![("ClearSpeak_Fractions", "OverEndFrac")], expr,
+ "1 przez 2, koniec ułamka, przez 2 przez 3, koniec ułamka; koniec ułamka")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn semi_nested_fraction() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "dwie trzecie x przez 6")?;
+ return Ok(());
+
+}
+
+#[test]
+fn general_nested_fraction() -> Result<()> {
+ let expr = "
+
+ ";
+ test("pl", "ClearSpeak", expr, "ułamek z licznikiem; 10 przez n; i mianownikiem 2 przez n")?;
+ return Ok(());
+
+}
+
+#[test]
+fn complex_nested_fraction() -> Result<()> {
+ let expr = "
+
+ ";
+ test("pl", "ClearSpeak", expr, "ułamek z licznikiem; ułamek z licznikiem; n plus 10; i mianownikiem n; i mianownikiem 2 przez n")?;
+ return Ok(());
+
+}
+
+#[test]
+fn simple_function() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "Auto")], expr, "f z x przez 2")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Verbose"), ("ClearSpeak_Fractions", "Auto")], expr, "f z x przez 2, koniec ułamka")?;
+ return Ok(());
+
+}
+
+#[test]
+fn function_over_function() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "Auto")], expr, "f z x przez g z x")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Verbose"), ("ClearSpeak_Fractions", "Auto")], expr, "f z x przez g z x, koniec ułamka")?;
+ return Ok(());
+
+}
+
+#[test]
+fn non_simple_function_over_function() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Fractions", "Auto")], expr,
+ "ułamek z licznikiem; f z, nawias otwierający, x plus 1, nawias zamykający; i mianownikiem g z x")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Verbose"), ("ClearSpeak_Fractions", "Auto")], expr,
+ "ułamek z licznikiem; f z, nawias otwierający, x plus 1, nawias zamykający; i mianownikiem g z x; koniec ułamka")?;
+ return Ok(());
+
+}
+
+#[test]
+fn binomial() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "2 razy 7 po 3")?;
+ return Ok(());
+
+}
diff --git a/tests/Languages/pl/ClearSpeak/mroot.rs b/tests/Languages/pl/ClearSpeak/mroot.rs
new file mode 100644
index 00000000..88292f51
--- /dev/null
+++ b/tests/Languages/pl/ClearSpeak/mroot.rs
@@ -0,0 +1,171 @@
+use crate::common::*;
+use anyhow::Result;
+
+#[test]
+fn msqrt_simple() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "pierwiastek kwadratowy z x")?;
+ return Ok(());
+
+}
+
+#[test]
+fn msqrt_simple_end_root() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_Roots", "RootEnd", expr, "pierwiastek kwadratowy z x, koniec pierwiastka")?;
+ return Ok(());
+
+}
+
+#[test]
+fn msqrt_simple_positive() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_Roots", "PosNegSqRoot", expr, "plus pierwiastek kwadratowy z x")?;
+ return Ok(());
+
+}
+
+#[test]
+fn msqrt_simple_pos_end_root() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_Roots", "PosNegSqRootEnd", expr, "plus pierwiastek kwadratowy z x, koniec pierwiastka")?;
+ return Ok(());
+
+}
+
+#[test]
+fn msqrt_simple_pos_end_with_neg_root() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_Roots", "PosNegSqRootEnd", expr,
+ "minus pierwiastek kwadratowy z x, koniec pierwiastka; minus, plus pierwiastek sześcienny z x, koniec pierwiastka")?;
+ return Ok(());
+
+}
+
+#[test]
+fn mroot_simple_pos_end_with_neg_root() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_Roots", "PosNegSqRoot", expr,
+ "minus pierwiastek sześcienny z x; minus plus pierwiastek kwadratowy z x")?;
+ return Ok(());
+
+}
+
+#[test]
+fn neg_without_root() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "minus x minus y")?;
+ return Ok(());
+
+}
+
+#[test]
+fn msqrt() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "pierwiastek kwadratowy z x plus y")?;
+ return Ok(());
+
+}
+
+#[test]
+fn mroot_as_square_root() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "pierwiastek kwadratowy z x")?;
+ return Ok(());
+
+}
+
+#[test]
+fn cube_root() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "pierwiastek sześcienny z x")?;
+ return Ok(());
+
+}
+
+#[test]
+fn ordinal_root() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "dziewiątej pierwiastek z x")?;
+ return Ok(());
+
+}
+
+#[test]
+fn simple_mi_root() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "n pierwiastek z x")?;
+ return Ok(());
+
+}
+
+#[test]
+fn mroot_simple_pos_end_root() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_Roots", "PosNegSqRootEnd", expr, "plus t pierwiastek z x, koniec pierwiastka")?;
+ return Ok(());
+
+}
+
+#[test]
+fn mroot_simple_end_root() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_Roots", "RootEnd", expr, "dwadzieścia pierwszej pierwiastek z x plus y, koniec pierwiastka")?;
+ return Ok(());
+
+}
+
+#[test]
+fn simple_fraction_power() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "jedna trzecia pierwiastek z x")?;
+ return Ok(());
+
+}
+
+#[test]
+fn no_double_the_532() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "pierwiastek sześcienny z pierwiastek kwadratowy z 42")?;
+ return Ok(());
+
+}
diff --git a/tests/Languages/pl/ClearSpeak/msup.rs b/tests/Languages/pl/ClearSpeak/msup.rs
new file mode 100644
index 00000000..fc20a27b
--- /dev/null
+++ b/tests/Languages/pl/ClearSpeak/msup.rs
@@ -0,0 +1,382 @@
+/// Tests for superscripts
+/// simple superscripts
+/// complex/nested superscripts
+use crate::common::*;
+use anyhow::Result;
+
+#[test]
+fn squared() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Auto")], expr, "x do kwadratu")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Ordinal")], expr, "x do potęgi drugiej")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "OrdinalPower")], expr, "x do potęgi drugiej")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "AfterPower")], expr, "x do potęgi 2")?;
+
+ return Ok(());
+
+}
+
+#[test]
+fn cubed() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Auto")], expr, "x do sześcianu")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Ordinal")], expr, "x do potęgi trzeciej")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "OrdinalPower")], expr, "x do potęgi trzeciej")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "AfterPower")], expr, "x do potęgi 3")?;
+ return Ok(());
+
+}
+
+#[test]
+fn ordinal_power() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Auto")], expr, "3 do potęgi piątej")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Ordinal")], expr, "3 do potęgi piątej")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "OrdinalPower")], expr, "3 do potęgi piątej")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "AfterPower")], expr, "3 do potęgi 5")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn zero_power() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Auto")], expr, "3 do potęgi 0")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Ordinal")], expr, "3 do potęgi 0")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "OrdinalPower")], expr, "3 do potęgi 0")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "AfterPower")], expr, "3 do potęgi 0")?;
+ return Ok(());
+
+}
+
+#[test]
+fn simple_mi_power() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Auto")], expr, "4 do potęgi x")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Ordinal")], expr, "4 do potęgi x")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "OrdinalPower")], expr, "4 do potęgi x")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "AfterPower")], expr, "4 do potęgi x")?;
+ return Ok(());
+
+}
+
+#[test]
+fn decimal_power() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Auto")], expr, "3 do potęgi 50")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Ordinal")], expr, "3 do potęgi 50")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "OrdinalPower")], expr, "3 do potęgi 50")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "AfterPower")], expr, "3 do potęgi 50")?;
+ return Ok(());
+
+}
+
+#[test]
+fn non_simple_power() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Auto")], expr, "3 do potęgi y plus 2")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Ordinal")], expr, "3 do potęgi y plus 2")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "OrdinalPower")], expr, "3 do potęgi y plus 2")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "AfterPower")], expr, "3 do potęgi y plus 2")?;
+ return Ok(());
+
+}
+
+#[test]
+fn negative_power() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Auto")], expr, "3 do potęgi minus 2")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Ordinal")], expr, "3 do potęgi minus 2")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "OrdinalPower")], expr, "3 do potęgi minus 2")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "AfterPower")], expr, "3 do potęgi minus 2")?;
+ return Ok(());
+
+}
+
+#[test]
+fn simple_fraction_power() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "x do potęgi jedna trzecia")?;
+ return Ok(());
+
+}
+
+#[test]
+fn nested_squared_power_with_coef() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Auto")], expr, "3 do potęgi 2 x do kwadratu")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Ordinal")], expr, "3 do wykładnika, 2 x do potęgi drugiej, koniec wykładnika")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "OrdinalPower")], expr, "3 do wykładnika, 2 x do potęgi drugiej, koniec wykładnika")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "AfterPower")], expr, "3 do wykładnika, 2 x do potęgi 2; koniec wykładnika")?;
+
+ return Ok(());
+
+}
+
+#[test]
+fn nested_squared_power_with_neg_coef() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "3 do potęgi minus 2 x do kwadratu")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn nested_cubed_power() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "y do potęgi 4 piąte do sześcianu")?;
+ return Ok(());
+
+}
+
+#[test]
+fn nested_cubed_power_with_neg_base() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "y do potęgi minus 4 piąte do sześcianu")?;
+ return Ok(());
+
+}
+
+#[test]
+fn nested_number_times_squared() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Auto")], expr, "e do potęgi jedna druga x do kwadratu")?;
+ return Ok(());
+
+}
+
+#[test]
+fn nested_negative_number_times_squared() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Auto")], expr, "e do potęgi minus jedna druga x do kwadratu")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Ordinal")], expr, "e do wykładnika, minus jedna druga x do potęgi drugiej, koniec wykładnika")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "OrdinalPower")], expr, "e do wykładnika, minus jedna druga x do potęgi drugiej, koniec wykładnika")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "AfterPower")], expr, "e do wykładnika, minus jedna druga x do potęgi 2; koniec wykładnika")?;
+ return Ok(());
+
+}
+
+#[test]
+fn nested_expr_to_tenth() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Auto")], expr, "3 do wykładnika, 3 do potęgi dziesiątej, koniec wykładnika")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Ordinal")], expr, "3 do wykładnika, 3 do potęgi dziesiątej, koniec wykładnika")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "OrdinalPower")], expr, "3 do wykładnika, 3 do potęgi dziesiątej, koniec wykładnika")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "AfterPower")], expr, "3 do wykładnika, 3 do potęgi 10; koniec wykładnika")?;
+
+ return Ok(());
+
+}
+
+#[test]
+fn nested_non_simple_squared_exp() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Auto")], expr, "3 do wykładnika, nawias otwierający, x plus 1, nawias zamykający do kwadratu, koniec wykładnika")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Ordinal")], expr, "3 do wykładnika, nawias otwierający, x plus 1, nawias zamykający do potęgi drugiej, koniec wykładnika")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "OrdinalPower")], expr, "3 do wykładnika, nawias otwierający, x plus 1, nawias zamykający do potęgi drugiej, koniec wykładnika")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "AfterPower")], expr, "3 do wykładnika, nawias otwierający, x plus 1, nawias zamykający do potęgi 2; koniec wykładnika")?;
+ return Ok(());
+
+}
+
+#[test]
+fn nested_default_power() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "t do wykładnika, 4 piąte do potęgi n, koniec wykładnika")?;
+ return Ok(());
+
+}
+
+#[test]
+fn nested_complex_power() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Auto")], expr,
+ "e do wykładnika, minus jedna druga razy; nawias otwierający; ułamek z licznikiem; x minus mi; i mianownikiem sigma; nawias zamykający do kwadratu, koniec wykładnika")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "Ordinal")], expr,
+ "e do wykładnika, minus jedna druga razy; nawias otwierający; ułamek z licznikiem; x minus mi; i mianownikiem sigma; nawias zamykający do potęgi drugiej, koniec wykładnika")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "OrdinalPower")], expr,
+ "e do wykładnika, minus jedna druga razy; nawias otwierający; ułamek z licznikiem; x minus mi; i mianownikiem sigma; nawias zamykający do potęgi drugiej, koniec wykładnika")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_Exponents", "AfterPower")], expr,
+ "e do wykładnika, minus jedna druga razy; nawias otwierający; ułamek z licznikiem; x minus mi; i mianownikiem sigma; nawias zamykający do potęgi 2; koniec wykładnika")?;
+ return Ok(());
+
+}
+
+#[test]
+fn default_power() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "t do potęgi ułamek z licznikiem; b plus 1; i mianownikiem 3")?;
+ return Ok(());
+
+}
diff --git a/tests/Languages/pl/ClearSpeak/multiline.rs b/tests/Languages/pl/ClearSpeak/multiline.rs
new file mode 100644
index 00000000..b57c8c6b
--- /dev/null
+++ b/tests/Languages/pl/ClearSpeak/multiline.rs
@@ -0,0 +1,173 @@
+use crate::common::*;
+use anyhow::Result;
+
+
+#[test]
+fn case_1() -> Result<()> {
+ let expr = "
+ ";
+ test_ClearSpeak("pl", "ClearSpeak_MultiLineLabel", "Auto", expr,
+ "f z x równa się; 3 przypadki; przypadek 1; minus 1 if x jest mniejsze niż 0; przypadek 2; 0 if x równa się 0; przypadek 3; 1 if x jest większe niż 0"
+ )?;
+ return Ok(());
+}
+
+#[test]
+fn equation_auto() -> Result<()> {
+ let expr = "
+ ";
+ test_ClearSpeak("pl", "ClearSpeak_MultiLineLabel", "Auto", expr,
+ "2 linie; linia 1; x plus y, równa się 7; linia 2; 2 x plus 3 y; równa się 17")?;
+ return Ok(());
+}
+
+
+#[test]
+fn equation_plus_at_start() -> Result<()> {
+ let expr = "
+ ";
+ test_ClearSpeak("pl", "ClearSpeak_MultiLineLabel", "Auto", expr, "2 linie; linia 1; x plus y równa się 7; linia 2; 2 x, plus 3 y, równa się 17")?;
+ return Ok(());
+}
+
+#[test]
+fn equation_case() -> Result<()> {
+ let expr = "
+ ";
+ test_ClearSpeak("pl", "ClearSpeak_MultiLineLabel", "Case", expr,
+ "2 przypadki; przypadek 1; x plus y, równa się 7; przypadek 2; 2 x plus 3 y; równa się 17")?;
+ return Ok(());
+}
+
+#[test]
+fn equation_constraint() -> Result<()> {
+ let expr = "
+ ";
+ test_ClearSpeak("pl", "ClearSpeak_MultiLineLabel", "Constraint", expr, "2 warunki; warunek 1; x plus y, równa się 7; warunek 2; 2 x plus 3 y; równa się 17")?;
+ return Ok(());
+}
+
+#[test]
+fn equation_equation() -> Result<()> {
+ let expr = "
+ ";
+ test_ClearSpeak("pl", "ClearSpeak_MultiLineLabel", "Equation", expr, "2 równania; równanie 1; x plus y, równa się 7; równanie 2; 2 x plus 3 y; równa się 17")?;
+ return Ok(());
+}
+
+#[test]
+fn equation_line() -> Result<()> {
+ let expr = "
+ ";
+ test_ClearSpeak("pl", "ClearSpeak_MultiLineLabel", "Line", expr, "2 linie; linia 1; x plus y, równa się 7; linia 2; 2 x plus 3 y; równa się 17")?;
+ return Ok(());
+}
+
+#[test]
+fn equation_none() -> Result<()> {
+ let expr = "
+ ";
+ test_ClearSpeak("pl", "ClearSpeak_MultiLineLabel", "None", expr,
+ "2 linie; x plus y, równa się 7; 2 x plus 3 y; równa się 17")?;
+ return Ok(());
+}
+
+#[test]
+fn equation_row() -> Result<()> {
+ let expr = "
+ ";
+ test_ClearSpeak("pl", "ClearSpeak_MultiLineLabel", "Row", expr, "2 wiersze; wiersz 1; x plus y, równa się 7; wiersz 2; 2 x plus 3 y; równa się 17")?;
+ return Ok(());
+}
+
+#[test]
+fn equation_step() -> Result<()> {
+ let expr = "
+ ";
+ test_ClearSpeak("pl", "ClearSpeak_MultiLineLabel", "Step", expr, "2 kroki; krok 1; x plus y, równa się 7; krok 2; 2 x plus 3 y; równa się 17")?;
+ return Ok(());
+}
+
+#[test]
+fn continued_row() -> Result<()> {
+ let expr = "";
+test("pl", "SimpleSpeak", expr,
+ "2 równania; równanie 1; x równa się y plus 1; równanie 2; y równa się 1")?;
+ return Ok(());
+}
diff --git a/tests/Languages/pl/ClearSpeak/sets.rs b/tests/Languages/pl/ClearSpeak/sets.rs
new file mode 100644
index 00000000..93a3dd77
--- /dev/null
+++ b/tests/Languages/pl/ClearSpeak/sets.rs
@@ -0,0 +1,531 @@
+use crate::common::*;
+use anyhow::Result;
+
+#[test]
+fn complex() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "liczby zespolone")?;
+ return Ok(());
+
+}
+
+#[test]
+fn natural() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "liczby naturalne")?;
+ return Ok(());
+
+}
+
+#[test]
+fn rationals() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "liczby wymierne")?;
+ return Ok(());
+
+}
+
+#[test]
+fn reals() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "liczby rzeczywiste")?;
+ return Ok(());
+
+}
+
+#[test]
+fn integers() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "liczby całkowite")?;
+ return Ok(());
+
+}
+
+
+
+#[test]
+fn msup_complex() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "C 2")?;
+ return Ok(());
+
+}
+
+#[test]
+fn msup_natural() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "N 2")?;
+ return Ok(());
+
+}
+
+#[test]
+fn msup_rationals() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "Q 2")?;
+ return Ok(());
+
+}
+
+#[test]
+fn msup_reals() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "R 3")?;
+ return Ok(());
+
+}
+
+#[test]
+fn msup_integers() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "Z 4")?;
+ return Ok(());
+
+}
+
+#[test]
+fn msup_positive_integers() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "plus liczby całkowite")?;
+ return Ok(());
+
+}
+
+#[test]
+fn msup_negative_integers() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "minus liczby całkowite")?;
+ return Ok(());
+
+}
+
+#[test]
+fn msup_positive_rationals() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "plus liczby wymierne")?;
+ return Ok(());
+
+}
+
+#[test]
+fn msup_negative_rationals() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "minus liczby wymierne")?;
+ return Ok(());
+
+}
+
+#[test]
+fn empty_set() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "zbiór pusty")?;
+ return Ok(());
+
+}
+
+#[test]
+fn single_element_set() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "zbiór 12")?;
+ return Ok(());
+
+}
+
+#[test]
+fn multiple_element_set() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "zbiór 5 przecinek, 10 przecinek, 15")?;
+ return Ok(());
+
+}
+
+#[test]
+fn set_with_colon() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "zbiór wszystkie x takich że x jest większe niż 2")?;
+ return Ok(());
+
+}
+
+#[test]
+fn set_with_bar() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "zbiór wszystkie x takich że x jest większe niż 2")?;
+ return Ok(());
+
+}
+
+#[test]
+fn element_alone() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "3 plus 2 i, nie jest elementem zbioru, liczby rzeczywiste")?;
+ return Ok(());
+
+}
+
+#[test]
+fn element_under_sum() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr,
+ "suma przez i jest elementem zbioru, liczby całkowite z; ułamek z licznikiem 1; i mianownikiem i do kwadratu")?;
+ return Ok(());
+
+}
+
+#[test]
+fn complicated_set_with_colon() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "zbiór wszystkie x do liczby całkowite takich że 2 jest mniejsze niż x jest mniejsze niż 7")?;
+ return Ok(());
+
+}
+
+#[test]
+fn complicated_set_with_mtext() -> Result<()> {
+ // as of 8/5/21, parsing of "|" is problematic in the example, so are needed for this test
+ let expr = "";
+ test("pl", "ClearSpeak", expr,
+ "zbiór wszystkie x do liczby naturalne takich że x is an even number")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn set_with_bar_member() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_SetMemberSymbol", "Member",
+ expr, "zbiór wszystkie x element zbioru liczby całkowite takich że x jest większe niż 5")?;
+ return Ok(());
+
+}
+
+#[test]
+fn element_alone_member() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_SetMemberSymbol", "Member",
+ expr, "3 plus 2 i, nie jest elementem zbioru, liczby rzeczywiste")?;
+ return Ok(());
+
+}
+
+#[test]
+fn element_under_sum_member() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_SetMemberSymbol", "Member",
+ expr, "suma przez i jest elementem zbioru, liczby całkowite z; ułamek z licznikiem 1; i mianownikiem i do kwadratu")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn set_with_bar_element() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_SetMemberSymbol", "Element",
+ expr, "zbiór wszystkie x należy do liczby całkowite takich że x jest większe niż 5")?;
+ return Ok(());
+
+}
+
+#[test]
+fn element_alone_element() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_SetMemberSymbol", "Element",
+ expr, "3 plus 2 i, nie jest elementem zbioru, liczby rzeczywiste")?;
+ return Ok(());
+
+}
+
+#[test]
+fn element_under_sum_element() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_SetMemberSymbol", "Element",
+ expr, "suma przez i jest elementem zbioru, liczby całkowite z; ułamek z licznikiem 1; i mianownikiem i do kwadratu")?;
+ return Ok(());
+
+}
+
+#[test]
+fn set_with_bar_in() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_SetMemberSymbol", "In",
+ expr, "zbiór wszystkie x do liczby całkowite takich że x jest większe niż 5")?;
+ return Ok(());
+
+}
+
+#[test]
+fn element_alone_in() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_SetMemberSymbol", "In",
+ expr, "3 plus 2 i, nie należy do liczby rzeczywiste")?;
+ return Ok(());
+
+}
+
+#[test]
+fn element_under_sum_in() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_SetMemberSymbol", "In",
+ expr, "suma przez i należy do liczby całkowite z; ułamek z licznikiem 1; i mianownikiem i do kwadratu")?;
+ return Ok(());
+
+}
+
+#[test]
+fn set_with_bar_belongs() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_SetMemberSymbol", "Belongs",
+ expr, "zbiór wszystkie x należące do liczby całkowite takich że x jest większe niż 5")?;
+ return Ok(());
+
+}
+
+#[test]
+fn element_alone_belongs() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_SetMemberSymbol", "Belongs",
+ expr, "3 plus 2 i, nie należy do liczby rzeczywiste")?;
+ return Ok(());
+
+}
+
+#[test]
+fn element_under_sum_belongs() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_SetMemberSymbol", "Belongs",
+ expr, "suma przez i należy do liczby całkowite z; ułamek z licznikiem 1; i mianownikiem i do kwadratu")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn set_member_woall() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak_prefs("pl", vec![("ClearSpeak_SetMemberSymbol", "Member"), ("ClearSpeak_Sets", "woAll")],
+ expr, "zbiór x element zbioru liczby całkowite takich że x jest większe niż 5")?;
+ return Ok(());
+
+}
+
+#[test]
+fn multiple_element_set_woall() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_Sets", "woAll", expr, "zbiór 5 przecinek, 10 przecinek, 15")?;
+ return Ok(());
+
+}
+
+#[test]
+fn multiple_element_set_silent_bracket() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_Sets", "SilentBracket", expr, "5 przecinek, 10 przecinek, 15")?;
+ return Ok(());
+
+ }
+
+#[test]
+fn silent_bracket() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_Sets", "SilentBracket", expr,
+ "zbiór wszystkie x takich że x jest większe niż 2")?;
+ return Ok(());
+
+ }
+
diff --git a/tests/Languages/pl/ClearSpeak/symbols_and_adornments.rs b/tests/Languages/pl/ClearSpeak/symbols_and_adornments.rs
new file mode 100644
index 00000000..160e0fec
--- /dev/null
+++ b/tests/Languages/pl/ClearSpeak/symbols_and_adornments.rs
@@ -0,0 +1,377 @@
+use crate::common::*;
+use anyhow::Result;
+
+#[test]
+fn multiplication() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "2 razy 3")?;
+ return Ok(());
+
+}
+
+#[test]
+fn multiplication_by() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_MultSymbolX", "By", expr, "2 na 3")?;
+ return Ok(());
+
+}
+
+#[test]
+fn multiplication_cross() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_MultSymbolX", "Cross", expr, "u krzyż v")?;
+ return Ok(());
+
+}
+
+#[test]
+fn ellipses_auto_start() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "trzy kropki przecinek, minus 2 przecinek, minus 1 przecinek, 0")?;
+ return Ok(());
+
+}
+
+#[test]
+fn ellipses_auto_end() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_Ellipses", "Auto", expr, "1 przecinek, 2 przecinek, 3 przecinek, trzy kropki")?;
+ return Ok(());
+
+}
+
+#[test]
+fn ellipses_auto_middle() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_Ellipses", "Auto", expr,
+ "1 przecinek, 2 przecinek, 3 przecinek, trzy kropki przecinek, 20")?;
+ return Ok(());
+
+}
+
+#[test]
+fn ellipses_auto_both() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_Ellipses", "Auto", expr,
+ "trzy kropki przecinek, minus 2 przecinek, minus 1 przecinek, 0 przecinek, 1 przecinek, 2 przecinek, trzy kropki")?;
+ return Ok(());
+
+}
+
+#[test]
+fn ellipses_and_so_on_start() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_Ellipses", "AndSoOn", expr, "trzy kropki przecinek, minus 2 przecinek, minus 1 przecinek, 0")?;
+ return Ok(());
+
+}
+
+#[test]
+fn ellipses_and_so_on_end() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_Ellipses", "AndSoOn", expr, "1 przecinek, 2 przecinek, 3 i tak dalej")?;
+ return Ok(());
+
+}
+
+#[test]
+fn ellipses_and_so_on_middle() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_Ellipses", "AndSoOn", expr,
+ "1 przecinek, 2 przecinek, 3 i tak dalej aż do 20")?;
+ return Ok(());
+
+}
+
+#[test]
+fn ellipses_and_so_on_both() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_Ellipses", "AndSoOn", expr,
+ "trzy kropki przecinek, minus 2 przecinek, minus 1 przecinek, 0 przecinek, 1 przecinek, 2 przecinek, trzy kropki")?;
+ return Ok(());
+
+}
+
+#[test]
+fn vertical_line_auto() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_VerticalLine", "Auto", expr,
+ "3 dzieli 6")?;
+ return Ok(());
+
+}
+
+#[test]
+fn vertical_line_divides() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_VerticalLine", "Divides", expr,
+ "3 dzieli 6")?;
+ return Ok(());
+
+}
+
+ #[test]
+ fn vertical_line_given() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_VerticalLine", "Given", expr,
+ "3 pod warunkiem 6")?;
+ return Ok(());
+
+ }
+
+ #[test]
+ fn vertical_line_probability_given() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak_prefs("pl", vec![("ClearSpeak_VerticalLine", "Given"), ("ClearSpeak_ImpliedTimes", "None")]
+ , expr, "wielka p; nawias otwierający, wielka a pod warunkiem wielka b; nawias zamykający")?;
+ return Ok(());
+ }
+
+#[test]
+fn vertical_line_set() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_VerticalLine", "Auto", expr,
+ "zbiór wszystkie x takich że x jest większe niż 0")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn vertical_line_set_such_that() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_VerticalLine", "SuchThat", expr,
+ "zbiór wszystkie x takich że x jest większe niż 0")?;
+ return Ok(());
+
+}
+
+#[test]
+fn vertical_line_set_given() -> Result<()> {
+ let expr = "";
+ // the rules for set will override all the options -- ClearSpeak spec should be clarified
+ test_ClearSpeak("pl", "ClearSpeak_VerticalLine", "Given", expr,
+ "zbiór wszystkie x takich że x jest większe niż 0")?;
+ return Ok(());
+
+}
+
+#[test]
+fn vertical_line_set_and_abs() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_VerticalLine", "Auto", expr,
+ "zbiór wszystkie x takich że wartość bezwzględna z x; jest większe niż 2")?;
+ return Ok(());
+
+}
+
+#[test]
+fn vertical_line_evaluated_at() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_VerticalLine", "Auto", expr,
+ "f z x obliczone w, x równa się 5")?;
+ return Ok(());
+
+}
+
+#[test]
+fn vertical_line_evaluated_at_both() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_VerticalLine", "Auto", expr,
+ "x do kwadratu plus x, obliczone w 1 minus to samo wyrażenie obliczone w 0")?;
+ return Ok(());
+
+}
+#[test]
+fn vertical_line_evaluated_at_divides() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_VerticalLine", "Divides", expr,
+ "f z x obliczone w, x równa się 5")?;
+ return Ok(());
+
+}
+
+#[test]
+fn vertical_line_evaluated_at_both_given() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_VerticalLine", "Given", expr,
+ "x do kwadratu plus x, obliczone w 1 minus to samo wyrażenie obliczone w 0")?;
+ return Ok(());
+
+}
\ No newline at end of file
diff --git a/tests/Languages/pl/SimpleSpeak/functions.rs b/tests/Languages/pl/SimpleSpeak/functions.rs
new file mode 100644
index 00000000..d7e6f53c
--- /dev/null
+++ b/tests/Languages/pl/SimpleSpeak/functions.rs
@@ -0,0 +1,412 @@
+/// Tests for:
+/// * functions including trig functions, logs, and functions to powers
+/// * implied times/functional call and explicit times/function call
+/// * parens
+/// These are all intertwined, so they are in one file
+use crate::common::*;
+use anyhow::Result;
+
+#[test]
+fn trig_names() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "sinus z x plus cosinus z y plus tangens z z plus sekans z alfa, plus kosekans z fi plus cotangens z fi")?;
+ return Ok(());
+
+}
+
+#[test]
+fn hyperbolic_trig_names() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "sinus hiperboliczny z x, plus cosinus hiperboliczny z y, plus tangens hiperboliczny z z, plus sekans hiperboliczny z alfa, plus kosekans hiperboliczny z fi, plus cotangens hiperboliczny z fi")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn inverse_trig() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "odwrotność sinus z x")?;
+ return Ok(());
+
+}
+
+#[test]
+fn trig_squared() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "sinus do kwadratu z x")?;
+ return Ok(());
+
+}
+
+#[test]
+fn trig_cubed() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "tangens do sześcianu z x")?;
+ return Ok(());
+
+}
+
+#[test]
+fn trig_fourth() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "sekans do potęgi czwartej, z x")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn trig_power_other() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "sinus hiperboliczny do potęgi n minus 1, z x")?;
+ return Ok(());
+
+}
+
+#[test]
+fn simple_log() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "logarytm z x")?;
+ return Ok(());
+
+}
+
+#[test]
+fn principal_value_log() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "Log z z")?;
+ return Ok(());
+
+}
+
+#[test]
+fn normal_log() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "logarytm z, nawias otwierający, x plus y, nawias zamykający")?;
+ return Ok(());
+
+}
+
+#[test]
+fn simple_log_with_base() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "logarytm o podstawie b, z x")?;
+ return Ok(());
+
+}
+
+#[test]
+fn normal_log_with_base() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "logarytm o podstawie b, z, nawias otwierający, x plus y, nawias zamykający")?;
+ return Ok(());
+
+}
+
+#[test]
+fn normal_ln() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Terse")],
+ expr, "l n, otwórz x plus y zamknij")?;
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Medium")],
+ expr, "logarytm naturalny z, nawias otwierający, x plus y, nawias zamykający")?;
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Verbose")],
+ expr, "logarytm naturalny z, nawias otwierający, x plus y, nawias zamykający")?;
+ return Ok(());
+
+}
+
+#[test]
+fn simple_ln() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Terse")],
+ expr, "l n x")?;
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Medium")],
+ expr, "logarytm naturalny z x")?;
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Verbose")],
+ expr, "logarytm naturalny z x")?;
+ return Ok(());
+
+}
+
+#[test]
+fn other_names() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Terse")],
+ expr, "kowariancja x")?;
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Medium")],
+ expr, "kowariancja x")?;
+ let expr = "";
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Terse")],
+ expr, "eksponenta x")?;
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Medium")],
+ expr, "funkcja wykładnicza z x")?;
+ return Ok(());
+
+}
+
+#[test]
+fn explicit_function_call_with_parens() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "t z x")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn explicit_times_with_parens() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "t razy x")?;
+ return Ok(());
+
+}
+
+#[test]
+fn explicit_function_call() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "t z x")?;
+ return Ok(());
+
+}
+
+#[test]
+fn explicit_times() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "t x")?;
+ return Ok(());
+
+}
+
+
+/*
+ * Tests for times
+ */
+#[test]
+fn no_times_binomial() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "x y")?;
+ return Ok(());
+
+}
+
+#[test]
+fn times_following_paren() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "2 razy 3")?;
+ return Ok(());
+
+}
+
+#[test]
+fn times_preceding_paren() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "2 razy 3")?;
+ return Ok(());
+
+}
+
+#[test]
+fn no_times_sqrt() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr,
+ "pierwiastek kwadratowy z a; razy pierwiastek kwadratowy z b; równa się, pierwiastek kwadratowy z a b, koniec pierwiastka")?;
+ test_prefs("pl", "SimpleSpeak", vec![("Impairment", "LearningDisability")], expr,
+ "pierwiastek kwadratowy z a; razy pierwiastek kwadratowy z b; równa się, pierwiastek kwadratowy z a b")?;
+ return Ok(());
+
+}
+
+/*
+ * Tests for parens
+ */
+ #[test]
+ fn no_parens_number() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "25 razy x")?;
+ return Ok(());
+
+ }
+
+ #[test]
+ fn no_parens_monomial() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "b, nawias otwierający, x y nawias zamykający")?;
+ return Ok(());
+
+ }
+
+ #[test]
+ fn no_parens_negative_number() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "2 plus minus 2")?;
+ return Ok(());
+
+ }
+
+
+ #[test]
+ fn no_parens_negative_number_with_var() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "minus 2 x, plus 1")?;
+ return Ok(());
+
+ }
+
+ #[test]
+ fn parens_superscript() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "nawias otwierający, 2 x nawias zamykający do kwadratu")?;
+ return Ok(());
+
+ }
+
+ #[test]
+ fn no_parens_fraction() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "2 plus jedna druga")?;
+ return Ok(());
+
+ }
+
+
+ // Tests for the four types of intervals in SimpleSpeak
+ #[test]
+ fn parens_interval_open_open() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak",expr, "przedział otwarty od c do d")?;
+ return Ok(());
+
+}
+
+#[test]
+ fn parens_interval_closed_open() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak",expr, "przedział lewostronnie domknięty prawostronnie otwarty od c do d")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn parens_interval_open_closed() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak",expr,"przedział lewostronnie otwarty prawostronnie domknięty od c do d")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn parens_interval_closed_closed() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak",expr, "przedział domknięty od c do d")?;
+ return Ok(());
+
+}
+
+ #[test]
+ fn parens_interval_neg_infinity_open_open() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak",expr,
+ "przedział otwarty od minus nieskończoność do d")?;
+ return Ok(());
+
+}
+
+ #[test]
+ fn parens_interval_neg_infinity_open_closed() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak",expr,
+ "przedział lewostronnie otwarty prawostronnie domknięty od minus nieskończoność do d")?;
+ return Ok(());
+
+}
+
diff --git a/tests/Languages/pl/SimpleSpeak/geometry.rs b/tests/Languages/pl/SimpleSpeak/geometry.rs
new file mode 100644
index 00000000..c4059be0
--- /dev/null
+++ b/tests/Languages/pl/SimpleSpeak/geometry.rs
@@ -0,0 +1,36 @@
+/// Tests for geometry listed in intent
+/// ABC as mtext and as separated letters
+use crate::common::*;
+use anyhow::Result;
+
+#[test]
+fn arc() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "łuk wielka b wielka c")?;
+ return Ok(());
+
+}
+
+#[test]
+fn ray() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "odcinek wielka x wielka y")?;
+ return Ok(());
+
+}
+
+#[test]
+fn arc_mtext() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "łuk wielka b wielka c")?;
+ return Ok(());
+
+}
+
+#[test]
+fn ray_mtext() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "półprosta wielka x wielka y")?;
+ return Ok(());
+
+}
diff --git a/tests/Languages/pl/SimpleSpeak/large_ops.rs b/tests/Languages/pl/SimpleSpeak/large_ops.rs
new file mode 100644
index 00000000..337a9304
--- /dev/null
+++ b/tests/Languages/pl/SimpleSpeak/large_ops.rs
@@ -0,0 +1,235 @@
+use crate::common::*;
+use anyhow::Result;
+
+#[test]
+fn sum_both() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "suma od n równa się 1, do 10; n")?;
+ return Ok(());
+
+}
+
+#[test]
+fn sum_under() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "suma przez wielka s z i")?;
+ return Ok(());
+
+}
+#[test]
+fn sum_both_msubsup() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "suma od n równa się 1, do 10; n")?;
+ return Ok(());
+
+}
+
+#[test]
+fn sum_sub() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "suma przez wielka s z i")?;
+ return Ok(());
+
+}
+
+#[test]
+fn sum() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "suma, a indeks dolny i")?;
+ return Ok(());
+
+}
+
+#[test]
+fn product_both() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "iloczyn od n równa się 1, do 10; n")?;
+ return Ok(());
+
+}
+
+#[test]
+fn product_under() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "iloczyn przez wielka s z i")?;
+ return Ok(());
+
+}
+
+#[test]
+fn product() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "iloczyn, a indeks dolny i")?;
+ return Ok(());
+
+}
+
+#[test]
+fn intersection_both() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "przecięcie od i równa się 1, do 10; wielka s indeks dolny i")?;
+ return Ok(());
+
+}
+
+#[test]
+fn intersection_under() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "przecięcie przez wielka c z, wielka s indeks dolny i")?;
+ return Ok(());
+
+}
+
+#[test]
+fn intersection() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "przecięcie, wielka s indeks dolny i")?;
+ return Ok(());
+
+}
+
+#[test]
+fn union_both() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "suma zbiorów od i równa się 1, do 10; wielka s indeks dolny i")?;
+ return Ok(());
+
+}
+
+#[test]
+fn union_under() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "suma zbiorów przez wielka c z, wielka s indeks dolny i")?;
+ return Ok(());
+
+}
+
+#[test]
+fn union() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "suma zbiorów, wielka s indeks dolny i")?;
+ return Ok(());
+
+}
+
+#[test]
+fn integral_both() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "całka od 0, do 1; f z x; d x")?;
+ return Ok(());
+
+}
+
+#[test]
+fn integral_under() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "całka przez liczby rzeczywiste z; f z x d x")?;
+ return Ok(());
+
+}
+
+#[test]
+fn integral() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "całka, f z x d x")?;
+ return Ok(());
+
+}
\ No newline at end of file
diff --git a/tests/Languages/pl/SimpleSpeak/linear_algebra.rs b/tests/Languages/pl/SimpleSpeak/linear_algebra.rs
new file mode 100644
index 00000000..d090856d
--- /dev/null
+++ b/tests/Languages/pl/SimpleSpeak/linear_algebra.rs
@@ -0,0 +1,111 @@
+use crate::common::*;
+use anyhow::Result;
+
+#[test]
+fn transpose() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "wielka m transponowane")?;
+ return Ok(());
+
+}
+
+#[test]
+fn trace() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "ślad z wielka m")?;
+ return Ok(());
+
+}
+
+#[test]
+fn dimension() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "wymiar z wielka m")?;
+ return Ok(());
+
+}
+
+#[test]
+fn homomorphism() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "homomorfizm z wielka m")?;
+ return Ok(());
+
+}
+
+#[test]
+fn kernel() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "jądro z wielka l")?;
+ return Ok(());
+
+}
+
+#[test]
+fn norm() -> Result<()> {
+ let expr = "
+";
+ test("pl", "SimpleSpeak", expr, "norma z f")?;
+ return Ok(());
+
+}
+
+#[test]
+fn norm_non_simple() -> Result<()> {
+ let expr = "
+";
+ test("pl", "SimpleSpeak", expr, "norma z x plus y koniec normy")?;
+ return Ok(());
+
+}
+
+#[test]
+fn norm_subscripted() -> Result<()> {
+ let expr = "
+";
+ test("pl", "SimpleSpeak", expr, "norma p z f")?;
+ return Ok(());
+
+}
+
+#[test]
+fn not_gradient() -> Result<()> {
+ // the nabla is at the end, so it can't be gradient because it doesn't operate on anything
+ let expr = r#"
+"#;
+ test("pl", "SimpleSpeak", expr, "nawias otwierający, b razy nabla, nawias zamykający; razy a")?;
+ return Ok(());
+
+}
\ No newline at end of file
diff --git a/tests/Languages/pl/SimpleSpeak/mfrac.rs b/tests/Languages/pl/SimpleSpeak/mfrac.rs
new file mode 100644
index 00000000..2e84dc98
--- /dev/null
+++ b/tests/Languages/pl/SimpleSpeak/mfrac.rs
@@ -0,0 +1,356 @@
+/// Tests for fractions
+/// includes simple fractions and more complex fractions
+/// also tests mixed fractions (implicit and explicit)
+use crate::common::*;
+use anyhow::Result;
+
+#[test]
+fn common_fraction_half() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "jedna druga")?;
+ return Ok(());
+
+}
+
+#[test]
+fn common_fraction_thirds() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "dwie trzecie")?;
+ return Ok(());
+
+}
+
+#[test]
+fn common_fraction_tenths() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "17 dziesiąte")?;
+ return Ok(());
+
+}
+
+#[test]
+#[allow(non_snake_case)]
+fn not_SimpleSpeak_common_fraction_tenths() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "89 przez 10")?;
+ return Ok(());
+
+}
+
+#[test]
+fn non_simple_fraction() -> Result<()> {
+ let expr = "
+
+ ";
+ test("pl", "SimpleSpeak", expr, "ułamek, x plus y, przez, x minus y, koniec ułamka")?;
+ return Ok(());
+
+}
+
+#[test]
+fn nested_fraction() -> Result<()> {
+ let expr = "
+
+ ";
+ test("pl", "SimpleSpeak", expr, "ułamek, x plus, ułamek, 1 przez y, koniec ułamka; przez, x minus y, koniec ułamka")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn deeply_nested_fraction_msqrt() -> Result<()> {
+ let expr = "
+
+ ";
+ test("pl", "SimpleSpeak", expr, "ułamek, x plus, pierwiastek kwadratowy z 1 przez y; koniec pierwiastka; przez, x minus y, koniec ułamka")?;
+ return Ok(());
+
+}
+
+#[test]
+fn deeply_nested_fraction_mrow_msqrt() -> Result<()> {
+ let expr = "
+
+ ";
+ test("pl", "SimpleSpeak", expr, "ułamek, x plus; pierwiastek kwadratowy z 2 plus 1 przez y; koniec pierwiastka; przez, x minus y, koniec ułamka")?;
+ return Ok(());
+
+}
+
+#[test]
+fn numerator_simple_fraction() -> Result<()> {
+ let expr = "
+
+ ";
+ test("pl", "SimpleSpeak", expr, "ułamek, x przez, x minus y, koniec ułamka")?;
+ return Ok(());
+
+}
+
+#[test]
+fn denominator_simple_fraction() -> Result<()> {
+ let expr = "
+
+ ";
+ test("pl", "SimpleSpeak", expr, "ułamek, x minus y, przez x, koniec ułamka")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn frac_with_units() -> Result<()> {
+ let expr = "
+ ";
+ test("pl", "SimpleSpeak", expr, "62 milas na godzina")?;
+ return Ok(());
+
+}
+
+#[test]
+fn singular_frac_with_units() -> Result<()> {
+ let expr = "
+ ";
+ test("pl", "SimpleSpeak", expr, "1 galon na mila")?;
+ return Ok(());
+
+}
+
+#[test]
+fn number_in_numerator_with_units() -> Result<()> {
+ let expr = "
+ ";
+ test("pl", "SimpleSpeak", expr, "3 galons na mila")?;
+ return Ok(());
+
+}
+
+#[test]
+fn units_with_powers() -> Result<()> {
+ let expr = "
+ ";
+ test("pl", "SimpleSpeak", expr, "3 metrs na sekunda do kwadratu")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn mixed_number() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "3 i jedna druga")?;
+ return Ok(());
+
+}
+
+#[test]
+fn explicit_mixed_number() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "3 i jedna ósma")?;
+ return Ok(());
+
+}
+
+#[test]
+fn mixed_number_big() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "3 i 7 osiemdziesiąt trzecich")?;
+ return Ok(());
+
+}
+
+#[test]
+fn simple_text() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "rise przez run")?;
+ return Ok(());
+
+}
+
+#[test]
+fn number_and_text() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "ułamek, 2 miles, przez, 3 gallons, koniec ułamka")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn nested_simple_fractions() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "ułamek, jedna druga, przez, dwie trzecie, koniec ułamka")?;
+ return Ok(());
+
+}
+
+#[test]
+fn binomial() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "2 razy 7 po 3")?;
+ return Ok(());
+
+}
+
+#[test]
+fn binomial_non_simple_top() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "2 razy, symbol newtona n plus 7 po 3")?;
+ return Ok(());
+
+}
+
+#[test]
+fn binomial_non_simple_bottom() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "2 razy, 7 po k plus 3 koniec symbolu newtona")?;
+ return Ok(());
+
+}
+
+#[test]
+fn binomial_non_simple_top_and_bottom() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "2 razy; symbol newtona n plus 7 po k plus 3 koniec symbolu newtona")?;
+ return Ok(());
+
+}
diff --git a/tests/Languages/pl/SimpleSpeak/msup.rs b/tests/Languages/pl/SimpleSpeak/msup.rs
new file mode 100644
index 00000000..4fdb0644
--- /dev/null
+++ b/tests/Languages/pl/SimpleSpeak/msup.rs
@@ -0,0 +1,379 @@
+/// Tests for superscripts
+/// simple superscripts
+/// complex/nested superscripts
+use crate::common::*;
+use anyhow::Result;
+
+#[test]
+fn squared() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "x do kwadratu")?;
+ return Ok(());
+
+}
+
+#[test]
+fn cubed() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "x do sześcianu")?;
+ return Ok(());
+
+}
+
+#[test]
+ fn ordinal_power() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "x do potęgi czwartej")?;
+ return Ok(());
+
+ }
+
+#[test]
+fn simple_mi_power() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "x do potęgi n")?;
+ return Ok(());
+
+}
+
+#[test]
+fn zero_power() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "x do potęgi 0")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn decimal_power() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "x do potęgi 2,0")?;
+ return Ok(());
+
+}
+
+#[test]
+fn non_simple_power() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "3 do potęgi y plus 2")?;
+ return Ok(());
+
+}
+
+#[test]
+fn negative_power() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "x do potęgi minus 2")?;
+ return Ok(());
+
+}
+
+#[test]
+fn simple_fraction_power() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "x do potęgi jedna trzecia")?;
+ return Ok(());
+
+}
+
+#[test]
+fn nested_squared_power_with_coef() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "3 do potęgi 2 x do kwadratu")?;
+ return Ok(());
+
+}
+
+#[test]
+fn nested_squared_power_with_neg_coef() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "3 do potęgi minus 2 x do kwadratu")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn nested_cubed_power() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "y do potęgi 4 piąte do sześcianu")?;
+ return Ok(());
+
+}
+
+#[test]
+fn nested_cubed_power_with_neg_base() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "y do potęgi minus 4 piąte do sześcianu")?;
+ return Ok(());
+
+}
+
+#[test]
+fn nested_number_times_squared() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "e do potęgi jedna druga x do kwadratu")?;
+ return Ok(());
+
+}
+
+#[test]
+fn nested_negative_number_times_squared() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "e do potęgi minus jedna druga, x do kwadratu")?;
+ return Ok(());
+
+}
+
+#[test]
+fn nested_expr_to_tenth() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "3 do potęgi 3 do potęgi dziesiątej")?;
+ return Ok(());
+
+}
+
+#[test]
+fn nested_non_simple_squared_exp() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "3 do potęgi nawias otwierający, x plus 1, nawias zamykający do kwadratu")?;
+ return Ok(());
+
+}
+
+#[test]
+fn nested_simple_power() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "t do potęgi 4 piąte do potęgi n")?;
+ return Ok(());
+
+}
+
+#[test]
+fn nested_end_exponent_power() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "t do potęgi 4 piąte do potęgi n plus 1; koniec wykładnika")?;
+ test_prefs("pl", "SimpleSpeak", vec![("Impairment", "LearningDisability")], expr,
+ "t do potęgi 4 piąte do potęgi n plus 1")?;
+ return Ok(());
+
+}
+
+#[test]
+fn nested_end_exponent_neg_power() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "t do potęgi 4 piąte do potęgi minus 3, koniec wykładnika")?;
+ return Ok(());
+
+}
+
+#[test]
+fn nested_complex_power() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "e do potęgi minus jedna druga razy; nawias otwierający; ułamek, x minus mi, przez sigma, koniec ułamka; nawias zamykający do kwadratu")?;
+ return Ok(());
+
+}
+
+#[test]
+fn default_power() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "t do potęgi ułamek, b plus 1, przez 3, koniec ułamka")?;
+ return Ok(());
+
+}
diff --git a/tests/Languages/pl/SimpleSpeak/multiline.rs b/tests/Languages/pl/SimpleSpeak/multiline.rs
new file mode 100644
index 00000000..f2551e17
--- /dev/null
+++ b/tests/Languages/pl/SimpleSpeak/multiline.rs
@@ -0,0 +1,73 @@
+use crate::common::*;
+use anyhow::Result;
+
+#[test]
+fn case_1() -> Result<()> {
+ let expr = "
+ ";
+ test("pl", "SimpleSpeak", expr, "f z x równa się; 3 przypadki; przypadek 1; minus 1 if x; jest mniejsze niż 0; przypadek 2; 0 if x, równa się 0; przypadek 3; 1 if x, jest większe niż 0")?;
+ return Ok(());
+}
+
+#[test]
+fn equation_1() -> Result<()> {
+ let expr = "
+ ";
+ test("pl", "SimpleSpeak", expr, "2 równania; równanie 1; x plus y, równa się 7; równanie 2; 2 x plus 3 y; równa się 17")?;
+ return Ok(());
+}
diff --git a/tests/Languages/pl/SimpleSpeak/sets.rs b/tests/Languages/pl/SimpleSpeak/sets.rs
new file mode 100644
index 00000000..43fe91db
--- /dev/null
+++ b/tests/Languages/pl/SimpleSpeak/sets.rs
@@ -0,0 +1,285 @@
+use crate::common::*;
+use anyhow::Result;
+
+#[test]
+fn complex() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "liczby zespolone")?;
+ return Ok(());
+
+}
+
+#[test]
+fn natural() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "liczby naturalne")?;
+ return Ok(());
+
+}
+
+#[test]
+fn rationals() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "liczby wymierne")?;
+ return Ok(());
+
+}
+
+#[test]
+fn reals() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "liczby rzeczywiste")?;
+ return Ok(());
+
+}
+
+#[test]
+fn integers() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "liczby całkowite")?;
+ return Ok(());
+
+}
+
+
+
+#[test]
+fn msup_complex() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "C 2")?;
+ return Ok(());
+
+}
+
+#[test]
+fn msup_natural() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "N 2")?;
+ return Ok(());
+
+}
+
+#[test]
+fn msup_rationals() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "Q 2")?;
+ return Ok(());
+
+}
+
+#[test]
+fn msup_reals() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "R 3")?;
+ return Ok(());
+
+}
+
+#[test]
+fn msup_integers() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "Z 4")?;
+ return Ok(());
+
+}
+
+#[test]
+fn msup_positive_integers() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "plus liczby całkowite")?;
+ return Ok(());
+
+}
+
+#[test]
+fn msup_negative_integers() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "minus liczby całkowite")?;
+ return Ok(());
+
+}
+
+#[test]
+fn msup_positive_rationals() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "plus liczby wymierne")?;
+ return Ok(());
+
+}
+
+#[test]
+fn msup_negative_rationals() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "minus liczby wymierne")?;
+ return Ok(());
+
+}
+
+#[test]
+fn empty_set() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "zbiór pusty")?;
+ return Ok(());
+
+}
+
+#[test]
+fn single_element_set() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "zbiór 12")?;
+ return Ok(());
+
+}
+
+#[test]
+fn multiple_element_set() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "zbiór 5 przecinek, 10 przecinek, 15")?;
+ return Ok(());
+
+}
+
+#[test]
+fn set_with_colon() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "zbiór wszystkich x takich że x jest większe niż 2")?;
+ return Ok(());
+
+}
+
+#[test]
+fn set_with_bar() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "zbiór wszystkich x takich że x jest większe niż 2")?;
+ return Ok(());
+
+}
+
+#[test]
+fn element_alone() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "3 plus 2 i, nie jest elementem zbioru, liczby rzeczywiste")?;
+ return Ok(());
+
+}
+
+#[test]
+fn element_under_sum() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr,
+ "suma przez i jest elementem zbioru, liczby całkowite z; ułamek, 1 przez, i do kwadratu, koniec ułamka")?;
+ return Ok(());
+
+}
+
+#[test]
+fn complicated_set_with_colon() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "zbiór wszystkich x elementem zbioru, liczby całkowite takich że 2 jest mniejsze niż x jest mniejsze niż 7")?;
+ return Ok(());
+
+}
+
+#[test]
+fn complicated_set_with_mtext() -> Result<()> {
+ // as of 8/5/21, parsing of "|" is problematic an element of the example, so are needed for this test
+ let expr = "";
+ test("pl", "SimpleSpeak", expr,
+ "zbiór wszystkich x elementem zbioru, liczby naturalne takich że x is an even number")?;
+ return Ok(());
+
+}
diff --git a/tests/Languages/pl/SimpleSpeak/subscripts.rs b/tests/Languages/pl/SimpleSpeak/subscripts.rs
new file mode 100644
index 00000000..709861d5
--- /dev/null
+++ b/tests/Languages/pl/SimpleSpeak/subscripts.rs
@@ -0,0 +1,64 @@
+use crate::common::*;
+use anyhow::Result;
+
+#[test]
+fn msub_simple() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "x 1")?;
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Medium")], expr, "x indeks dolny 1")?;
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr, "x indeks dolny 1")?;
+ return Ok(());
+
+ }
+
+#[test]
+fn msub_not_simple() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "x indeks dolny 12")?;
+ return Ok(());
+
+ }
+
+#[test]
+fn msubsup_not_simple() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "x indeks dolny 12, do sześcianu")?;
+ return Ok(());
+
+ }
+
+#[test]
+fn msub_simple_mi() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "x indeks dolny i")?;
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr, "x indeks dolny i")?;
+ return Ok(());
+
+}
+
+#[test]
+fn msub_simple_number_follows() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "x 1, 10 do kwadratu")?;
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr, "x indeks dolny 1; 10 do kwadratu")?;
+ return Ok(());
+
+}
+
+#[test]
+fn msub_simple_non_number_follows() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "x 1, do kwadratu")?;
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr, "x indeks dolny 1, do kwadratu")?;
+ return Ok(());
+
+}
+
+#[test]
+fn msubsup_simple() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "x 1, x do kwadratu")?;
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr, "x indeks dolny 1; x do kwadratu")?;
+ return Ok(());
+
+}
\ No newline at end of file
diff --git a/tests/Languages/pl/alphabets.rs b/tests/Languages/pl/alphabets.rs
new file mode 100644
index 00000000..5c2aef97
--- /dev/null
+++ b/tests/Languages/pl/alphabets.rs
@@ -0,0 +1,415 @@
+/// Tests for rules shared between various speech styles:
+/// * this has tests focused on the various alphabets
+use crate::common::*;
+use anyhow::Result;
+
+
+#[test]
+fn special_alphabet_chars() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "fraktura wielka h, przecinek, fraktura wielka c")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "dwukreskowe wielka h, przecinek; dwukreskowe wielka pi")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pisane wielka i przecinek, pisane wielka m")?;
+ return Ok(());
+
+}
+
+#[test]
+fn greek() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "wielka alfa przecinek, wielka omega")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "alfa przecinek, omega")?;
+ // MathType private space versions
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "dwukreskowe wielka delta, przecinek; dwukreskowe wielka ypsilon")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "alfa przecinek, omega")?;
+ return Ok(());
+
+}
+
+#[test]
+fn cap_cyrillic() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "wielka a przecinek, wielka ja")?;
+ return Ok(());
+
+}
+
+#[test]
+fn parenthesized() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "w nawiasie a przecinek, w nawiasie z")?;
+ return Ok(());
+
+}
+
+#[test]
+fn circled() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "w kółku wielka a, przecinek, w kółku wielka z")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "czarny w kółku wielka a, przecinek; czarny w kółku wielka z")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "w kółku a przecinek, w kółku z")?;
+ return Ok(());
+
+}
+
+#[test]
+fn fraktur() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "fraktura wielka a, przecinek, fraktura wielka y")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "fraktura a przecinek, fraktura z")?;
+ // MathType private space versions
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "fraktura wielka a, przecinek, fraktura wielka y")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "fraktura a przecinek, fraktura z")?;
+ return Ok(());
+
+}
+
+#[test]
+fn bold_fraktur() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "fraktura pogrubione wielka a, przecinek; fraktura pogrubione wielka z")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "fraktura pogrubione a, przecinek; fraktura pogrubione z")?;
+ // MathType private space versions
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "fraktura pogrubione wielka a, przecinek; fraktura pogrubione wielka z")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "fraktura pogrubione a, przecinek; fraktura pogrubione z")?;
+ return Ok(());
+
+}
+
+#[test]
+fn double_struck() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "dwukreskowe wielka a, przecinek; dwukreskowe wielka y")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "dwukreskowe a przecinek, dwukreskowe z")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "dwukreskowe 0 przecinek, dwukreskowe 9")?;
+ // MathType private space versions
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "dwukreskowe wielka a, przecinek; dwukreskowe wielka y")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "dwukreskowe a przecinek, dwukreskowe z")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "dwukreskowe 0 przecinek, dwukreskowe 9")?;
+ return Ok(());
+
+}
+
+#[test]
+fn script() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pisane wielka a przecinek, pisane wielka z")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pisane a przecinek, pisane z")?;
+ // MathType private space versions
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pisane wielka a przecinek, pisane wielka z")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pisane a przecinek, pisane z")?;
+ return Ok(());
+
+}
+
+#[test]
+fn bold_script() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pisane pogrubione wielka a, przecinek; pisane pogrubione wielka z")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pisane pogrubione a, przecinek, pisane pogrubione z")?;
+ // MathType private space versions
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pisane pogrubione wielka a, przecinek; pisane pogrubione wielka z")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pisane pogrubione a, przecinek, pisane pogrubione z")?;
+ return Ok(());
+
+}
+
+#[test]
+fn bold() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pogrubione wielka a, przecinek; pogrubione wielka z")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pogrubione a przecinek, pogrubione z")?;
+ // MathType private space versions
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pogrubione wielka a, przecinek; pogrubione wielka z")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pogrubione a przecinek, pogrubione z")?;
+ return Ok(());
+
+}
+
+#[test]
+fn italic() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "wielka a przecinek, wielka z")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "a przecinek, z")?;
+ // MathType private space versions
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "wielka a przecinek, wielka z")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "a przecinek, z")?;
+ return Ok(());
+
+}
+
+#[test]
+fn sans_serif() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "wielka a przecinek, wielka z")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "a przecinek, z")?;
+ // MathType private space versions
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "wielka a przecinek, wielka z")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "a przecinek, z")?;
+ return Ok(());
+
+}
+
+#[test]
+fn sans_serif_bold() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pogrubione wielka a, przecinek; pogrubione wielka z")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pogrubione a przecinek, pogrubione z")?;
+ // MathType private space versions
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pogrubione wielka a, przecinek; pogrubione wielka z")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pogrubione a przecinek, pogrubione z")?;
+ return Ok(());
+
+}
+
+#[test]
+fn sans_serif_italic() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "wielka a przecinek, wielka z")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "a przecinek, z")?;
+ // MathType private space versions
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "wielka a przecinek, wielka z")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "a przecinek, z")?;
+ return Ok(());
+
+}
+
+#[test]
+fn sans_serif_bold_italic() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pogrubione wielka a, przecinek; pogrubione wielka z")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pogrubione a przecinek, pogrubione z")?;
+ // MathType private space versions
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pogrubione wielka a, przecinek; pogrubione wielka z")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pogrubione a przecinek, pogrubione z")?;
+ return Ok(());
+
+}
+
+#[test]
+fn monospace() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "wielka a przecinek, wielka z")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "a przecinek, z")?;
+ // MathType private space versions
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "wielka a przecinek, wielka z")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "a przecinek, z")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn bold_greek() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pogrubione wielka alfa, przecinek; pogrubione wielka omega")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pogrubione alfa przecinek, pogrubione omega")?;
+ // MathType private space versions
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pogrubione wielka alfa, przecinek; pogrubione wielka omega")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pogrubione alfa przecinek, pogrubione omega")?;
+ return Ok(());
+
+}
+
+#[test]
+fn bold_greek_others() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pogrubione pochodna cząstkowa, przecinek, pogrubione pi")?;
+ // MathType private space versions
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pogrubione pochodna cząstkowa, przecinek, pogrubione pi")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn italic_greek() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "wielka alfa przecinek, wielka omega")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "alfa przecinek, omega")?;
+ // MathType private space versions
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "wielka alfa przecinek, wielka omega")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "alfa przecinek, omega")?;
+ return Ok(());
+
+}
+
+#[test]
+fn italic_greek_others() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pochodna cząstkowa, przecinek, pi")?;
+ // MathType private space versions
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pochodna cząstkowa, przecinek, pi")?;
+ return Ok(());
+
+}
+
+#[test]
+fn bold_italic_greek() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pogrubione wielka alfa, przecinek; pogrubione wielka omega")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pogrubione alfa przecinek, pogrubione omega")?;
+ // MathType private space versions
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pogrubione wielka alfa, przecinek; pogrubione wielka omega")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pogrubione alfa przecinek, pogrubione omega")?;
+ return Ok(());
+
+}
+
+#[test]
+fn bold_italic_greek_others() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pogrubione pochodna cząstkowa, przecinek, pogrubione pi")?;
+ // MathType private space versions
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pogrubione pochodna cząstkowa, przecinek, pogrubione pi")?;
+ return Ok(());
+
+}
+
+#[test]
+fn sans_serif_bold_greek() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pogrubione wielka alfa, przecinek; pogrubione wielka omega")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pogrubione alfa przecinek, pogrubione omega")?;
+ // MathType private space versions
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pogrubione wielka alfa, przecinek; pogrubione wielka omega")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pogrubione alfa przecinek, pogrubione omega")?;
+ return Ok(());
+
+}
+
+#[test]
+fn sans_serif_bold_greek_others() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pogrubione pochodna cząstkowa, przecinek, pogrubione pi")?;
+ // MathType private space versions
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pogrubione pochodna cząstkowa, przecinek, pogrubione pi")?;
+ return Ok(());
+
+}
+
+#[test]
+fn sans_serif_bold_italic_greek() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pogrubione wielka alfa, przecinek; pogrubione wielka omega")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pogrubione alfa przecinek, pogrubione omega")?;
+ // MathType private space versions
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pogrubione wielka alfa, przecinek; pogrubione wielka omega")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pogrubione alfa przecinek, pogrubione omega")?;
+ return Ok(());
+
+}
+
+#[test]
+fn sans_serif_bold_italic_greek_others() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pogrubione pochodna cząstkowa, przecinek, pogrubione pi")?;
+ // MathType private space versions
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "pogrubione pochodna cząstkowa, przecinek, pogrubione pi")?;
+ return Ok(());
+
+}
+
+#[test]
+fn pua_regular() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "wielka a przecinek, wielka z")?;
+ return Ok(());
+
+}
+
+#[test]
+fn turned() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "odwrócone wielka f, przecinek; odwrócony bezszeryfowe wielka y")?;
+ return Ok(());
+
+ }
+
+#[test]
+fn unicode_typo_regressions() -> Result<()> {
+ test("pl", "SimpleSpeak", "", "do potęgi i")?;
+ test("pl", "SimpleSpeak", "", "koniunkcja")?;
+ Ok(())
+}
+
+#[test]
+fn enclosed_numbers() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "w kółku 1 przecinek, w kółku 9")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "czarny w kółku jeden, przecinek; w kółku numer pięćdziesiąt")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "w nawiasie 1 przecinek, w nawiasie 9")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "1 z kropką przecinek, 9 z kropką")?;
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "podwójny w kółku 1, przecinek; podwójny w kółku 9")?;
+ return Ok(());
+
+}
diff --git a/tests/Languages/pl/chemistry.rs b/tests/Languages/pl/chemistry.rs
new file mode 100644
index 00000000..cda36182
--- /dev/null
+++ b/tests/Languages/pl/chemistry.rs
@@ -0,0 +1,766 @@
+/// Tests for rules shared between various speech styles:
+/// * modified var
+use crate::common::*;
+use anyhow::Result;
+
+#[test]
+fn salt() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "wielka n a, wielka c l")?;
+ return Ok(());
+
+}
+
+#[test]
+fn water() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Terse")], expr, "wielka h, 2 wielka o")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium")], expr, "wielka h, indeks dolny 2, wielka o")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Verbose")], expr, "wielka h, indeks dolny 2, wielka o")?;
+ return Ok(());
+
+}
+
+#[test]
+fn carbon() -> Result<()> {
+ let expr = ""; // not enough to trigger recognition
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "wielka c")?;
+ return Ok(());
+
+}
+
+#[test]
+fn sulfate() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium")], expr, "nawias kwadratowy otwierający; wielka s, wielka o, indeks dolny 4; nawias kwadratowy zamykający indeks górny 2 minus")?;
+ return Ok(());
+
+}
+
+#[test]
+fn aluminum_sulfate() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Terse")], expr, "wielka a l, 2, otwórz, wielka s, wielka o, 4; zamknij 3")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium")], expr, "wielka a l, indeks dolny 2; nawias otwierający; wielka s, wielka o, indeks dolny 4; nawias zamykający indeks dolny 3")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Verbose")], expr, "wielka a l, indeks dolny 2; nawias otwierający; wielka s, wielka o, indeks dolny 4; nawias zamykający indeks dolny 3")?;
+ return Ok(());
+
+}
+
+#[test]
+fn ethanol_bonds() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Terse")], expr, "wielka c, wielka h, 3, wiązanie pojedyncze, wielka c, wielka h, 2, wiązanie pojedyncze, wielka o, wielka h")?;
+
+ return Ok(());
+
+}
+
+#[test]
+fn dichlorine_hexoxide() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Terse")],
+ expr, "nawias kwadratowy otwierający; wielka c l, wielka o, 2; nawias kwadratowy zamykający plus; nawias kwadratowy otwierający; wielka c l, wielka o, 4; nawias kwadratowy zamykający minus")?;
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Medium")],
+ expr, "nawias kwadratowy otwierający; wielka c l, wielka o, indeks dolny 2; nawias kwadratowy zamykający indeks górny plus; nawias kwadratowy otwierający; wielka c l, wielka o, indeks dolny 4; nawias kwadratowy zamykający indeks górny minus")?;
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Verbose")],
+ expr, "nawias kwadratowy otwierający; wielka c l, wielka o, indeks dolny 2; nawias kwadratowy zamykający indeks górny plus; nawias kwadratowy otwierający; wielka c l, wielka o, indeks dolny 4; nawias kwadratowy zamykający indeks górny minus")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn ethylene_with_bond() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "wielka h, 2 wielka c, wiązanie podwójne, wielka c, wielka h, 2")?;
+ return Ok(());
+
+}
+
+#[test]
+fn ferric_chloride_aq() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "wielka f e, wielka c l, 3 wodny")?;
+ return Ok(());
+
+ }
+
+#[test]
+fn ethylene_with_colon_bond() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "wielka h, 2 wielka c, wiązanie podwójne, wielka c, wielka h, 2")?;
+ return Ok(());
+
+}
+
+#[test]
+fn beta_decay() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Terse")], expr,
+ "14, 6, wielka c; tworzy, 14, 7, wielka n; plus 0, minus 1, e")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium")], expr,
+ "indeks górny 14, indeks dolny 6, wielka c; reaguje tworząc; indeks górny 14, indeks dolny 7, wielka n; plus, indeks górny 0, indeks dolny minus 1, e")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Verbose")], expr,
+ "indeks górny 14, indeks dolny 6, wielka c; reaguje tworząc; indeks górny 14, indeks dolny 7, wielka n; plus, indeks górny 0, indeks dolny minus 1, e")?;
+ return Ok(());
+
+}
+
+#[test]
+fn mhchem_beta_decay() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Terse")], expr,
+ "14, 6, wielka c; tworzy, 14, 7, wielka n; plus 0, minus 1, e")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium")], expr,
+ "indeks górny 14, indeks dolny 6, wielka c; reaguje tworząc; indeks górny 14, indeks dolny 7, wielka n; plus, indeks górny 0, indeks dolny minus 1, e")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Verbose")], expr,
+ "indeks górny 14, indeks dolny 6, wielka c; reaguje tworząc; indeks górny 14, indeks dolny 7, wielka n; plus, indeks górny 0, indeks dolny minus 1, e")?;
+ return Ok(());
+
+}
+
+#[test]
+fn hcl_na_yields() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr,
+ "2, wielka h, wielka c l; plus 2 wielka n a; reaguje tworząc; 2, wielka n a, wielka c l; plus wielka h, indeks dolny 2")?;
+ return Ok(());
+
+}
+
+#[test]
+fn mhchem_so4_2plus() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "wielka s; wielka o, 4, 2 plus")?;
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Medium")], expr, "wielka s; wielka o, indeks dolny 4, indeks górny 2 plus")?;
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr, "wielka s; wielka o, indeks dolny 4, indeks górny 2 plus")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn mhchem_hcl_aq_etc() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Terse")],
+ expr, "2, wielka h, wielka c l, wodny; plus, 2, wielka n a, ciało stałe; tworzy; 2, wielka n a, wielka c l, wodny; plus, wielka h, 2; gaz")?;
+
+ return Ok(());
+
+}
+
+
+#[test]
+fn mhchem_barbed_equilibrium() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Terse")],
+ expr, "wielka h, 2; gaz; plus; wielka i, 2; gaz; jest w równowadze z, 2, wielka h, wielka i, gaz")?;
+ return Ok(());
+
+}
+
+
+
+#[test]
+fn mhchem_roman_in_superscript() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Terse")],
+ expr, "wielka f e, 2; wielka f e, 3; wielka o, 4")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn dropped_msubsup_bug_358() -> Result<()> {
+ let expr = r#""#;
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Terse")],
+ expr, "2, wielka s, wielka o, 2; plus; wielka o, 2 jest w równowadze z, 2, wielka s, wielka o, 3")?;
+ return Ok(());
+
+}
+
+
diff --git a/tests/Languages/pl/definitions.rs b/tests/Languages/pl/definitions.rs
new file mode 100644
index 00000000..9115608b
--- /dev/null
+++ b/tests/Languages/pl/definitions.rs
@@ -0,0 +1,1032 @@
+/// Tests for rules in definitions:
+/// * modified var
+use crate::common::*;
+use anyhow::Result;
+
+#[test]
+fn tuple_basic() -> Result<()> {
+ // function
+ let expr = r#"
+
+ "#;
+
+ test("pl", "ClearSpeak", expr, "krotka z x przecinek, y")?;
+ test("pl", "SimpleSpeak", expr, "krotka z x przecinek, y")?;
+
+ return Ok(());
+}
+
+#[test]
+fn my_set_basic() -> Result<()> {
+ let expr = r#"
+
+ "#;
+
+ test("pl", "ClearSpeak", expr, "zbiór pusty")?;
+
+ Ok(())
+}
+
+#[test]
+fn fixed_test() -> Result<()> {
+ let expr = r#"
+
+ "#;
+
+ // Bez jawnej fixity silnik oddaje surową nazwę intentu (zachowanie rdzenia,
+ // identyczne w EN i PL). Poprawne tłumaczenie "zbiór liczb rzeczywistych"
+ // pojawia się przy intencie z ":nofix" (patrz nofix_set_tests).
+ test("pl", "ClearSpeak", expr, "set of reals")?;
+ Ok(())
+}
+
+#[test]
+fn i_test() -> Result<()> {
+ let expr = r#"
+
+ "#;
+
+ // Bez jawnej fixity: surowa nazwa intentu (rdzeń, jak w EN).
+ test("pl", "ClearSpeak", expr, "imaginary i")?;
+ Ok(())
+}
+
+
+#[test]
+fn floor_basic() -> Result<()> {
+ let expr = r#"
+
+ "#;
+
+ test("pl", "ClearSpeak", expr, "podłoga z x")?;
+
+ Ok(())
+}
+
+#[test]
+fn set_difference_basic() -> Result<()> {
+ let expr = r#"
+
+ "#;
+
+ test("pl", "ClearSpeak", expr, "i z wielka a przecinek, wielka b")?;
+
+ Ok(())
+}
+
+#[test]
+fn postfix_test() -> Result<()> {
+ let tests = [
+ (
+ "transpose",
+ r#"
+
+ x
+ T
+
+ "#,
+ "transpozycja z x",
+ ),
+ (
+ "highlight",
+ r#"
+
+ x
+
+ "#,
+ "x podświetlone",
+ ),
+ ];
+
+ // Loop through all test cases, name _, body, and expected result
+ for (_, body, expected) in tests {
+ let expr = format!(
+ r#"
+
+ "#,
+ body
+ );
+
+ test("pl", "ClearSpeak", &expr, expected)?;
+ }
+
+ Ok(())
+}
+
+#[test]
+fn prefix_test() -> Result<()> {
+ // Prefix test limit, unit-vector, line-segment
+ // Directed-line-segment, line, ray, arc
+ let tests = [
+ (
+ "limit",
+ r#"
+
+ x
+
+ "#,
+ "granica gdy x",
+ ),
+ (
+ "unit-vector",
+ r#"
+
+ x
+ ^
+
+ "#,
+ "wektor jednostkowy x",
+ ),
+ (
+ "line-segment",
+ r#"
+
+ x
+ ¯
+
+ "#,
+ "odcinek x",
+ ),
+ ];
+
+ for (_, body, expected) in tests {
+ let expr = format!(
+ r#"
+
+ "#,
+ body
+ );
+
+ test("pl", "ClearSpeak", &expr, expected)?;
+ }
+
+ Ok(())
+}
+
+
+#[test]
+fn functions_and_inverses_tests() -> Result<()> {
+ let tests = vec![
+ //("closed-interval", "closed interval between x and y"),
+ //("closed-open-interval", "interval between x included and y"),
+ //("open-closed-interval", "interval between x and y included"),
+ //("open-interval", "open interval between x and y"),
+
+ ("inverse", "odwrotność z x"),
+ ("domain", "dziedzina z x"),
+ ("codomain", "przeciwdziedzina z x"),
+ ("image", "obraz z x"),
+
+ //("fraction", "fraction x over y end fraction"),
+ ("mixed-fraction", "x i y"),
+ ("quotient", "podzielone przez z x przecinek, y"),
+ ("evaluated-at", "x obliczone w y"),
+ ("remainder", "podzielone przez z x przecinek, y"),
+
+ ("max", "maksimum z x przecinek, y przecinek, z"),
+ ("min", "minimum z x przecinek, y przecinek, z"),
+
+ ("power", "x do potęgi y"),
+
+ // ("root", ...) pominięte: intent 'root' bez indeksu rzuca błąd
+ // dopasowania reguły w RDZENIU silnika (identycznie w EN i PL),
+ // więc to nie jest luka polskiej lokalizacji.
+
+ ("greatest-common-divisor", "największy wspólny dzielnik z x przecinek, y przecinek, z"),
+ ("least-common-multiple", "najmniejsza wspólna wielokrotność z x przecinek, y przecinek, z"),
+
+ ("absolute-value", "wartość bezwzględna z x"),
+
+ ("complex-conjugate", "sprzężenie zespolone z x"),
+ ("complex-arg", "arg z x"),
+ ("real-part", "część rzeczywista"),
+ ("imaginary-part", "część urojona"),
+
+ ("polar-coordinate", "przecinek z x przecinek, y"),
+ ("spherical-coordinate", "przecinek z x przecinek, y przecinek, z"),
+ ("cartesian-coordinate", "przecinek z x przecinek, y przecinek, z"),
+ ("coordinate", "przecinek, x przecinek y przecinek z"),
+
+ ("floor", "podłoga z x"),
+ ("ceiling", "sufit z x"),
+ ("round", "zaokrąglenie z x"),
+ ("fractional-part", "część ułamkowa z x"),
+
+
+ ];
+
+ for (intent, expected) in tests {
+ let expr = match intent {
+
+ "max"
+ | "min"
+ | "greatest-common-divisor"
+ | "least-common-multiple"
+ | "spherical-coordinate"
+ | "cartesian-coordinate"
+ | "coordinate" => {
+ format!(
+ "",
+ intent
+ )
+ }
+
+ "power"
+ | "mixed-fraction"
+ | "quotient"
+ | "evaluated-at"
+ | "remainder"
+ | "closed-interval"
+ | "closed-open-interval"
+ | "open-closed-interval"
+ | "open-interval"
+ | "polar-coordinate" => {
+ format!(
+ "",
+ intent
+ )
+ }
+
+ _ => {
+ format!(
+ "",
+ intent
+ )
+ }
+ };
+
+ test("pl", "ClearSpeak", &expr, expected)?;
+ }
+
+ Ok(())
+}
+
+
+#[test]
+fn calculus_tests() -> Result<()> {
+ let tests = vec![
+ //("derivative", "the derivative of x with respect to x"),
+ //"definite-integral", "integral over x from x to x"),
+
+ // prefix
+ ("limit", "granica gdy x"),
+
+ // infix
+ ("tends-to", "x dąży do y"),
+ ("tends-to-from-above", "x dąży do z prawej y"),
+ ("tends-to-from-below", "x dąży do z lewej y"),
+ ];
+
+ for (intent, expected) in tests {
+ let expr = match intent {
+ "limit" => {
+ format!(
+ "",
+ intent
+ )
+ }
+
+ _ => {
+ // infix cases
+ format!(
+ "",
+ intent
+ )
+ }
+ };
+
+ test("pl", "ClearSpeak", &expr, expected)?;
+ }
+
+ Ok(())
+}
+
+
+#[test]
+fn set_tests() -> Result<()> {
+ let tests = vec![
+ ("set", "zbiór x"),
+ // ("set-difference", "set difference of x and y"),
+ ("complement", "dopełnienie z x"),
+ //("empty-set", "empty set"),
+ ("cardinality", "moc zbioru z x"),
+ ("list", "lista z x"),
+ ("tuple", "krotka z x"),
+ ];
+
+ for (intent, expected) in tests {
+ let expr = format!(
+ "",
+ intent
+ );
+
+ test("pl", "ClearSpeak", &expr, expected)?;
+ }
+
+ Ok(())
+}
+
+
+#[test]
+fn sequence_and_series_intents() -> Result<()> {
+ let tests = [
+ (
+ "sum-1",
+ r#"
+
+ ∑
+ x
+
+ "#,
+ "suma z x",
+ ),
+ (
+ "sum-2",
+ r#"
+
+ ∑
+ i
+ x
+
+ "#,
+ "suma z i przecinek, x",
+ ),
+ (
+ "sum-3",
+ r#"
+
+ ∑
+ i
+ n
+ x
+
+ "#,
+ "suma z i przecinek, n przecinek, x",
+ ),
+ (
+ "product-1",
+ r#"
+
+ ∏
+ x
+
+ "#,
+ "iloczyn z x",
+ ),
+ (
+ "product-2",
+ r#"
+
+ ∏
+ i
+ x
+
+ "#,
+ "iloczyn z i przecinek, x",
+ ),
+ (
+ "product-3",
+ r#"
+
+ ∏
+ i
+ n
+ x
+
+ "#,
+ "iloczyn z i przecinek, n przecinek, x",
+ ),
+ ];
+
+ for (_, body, expected) in tests {
+ let expr = format!(
+ r#"
+
+ "#,
+ body
+ );
+
+ test("pl", "ClearSpeak", &expr, expected)?;
+ }
+
+ Ok(())
+}
+
+#[test]
+fn elementary_classical_tests() -> Result<()> {
+ let tests = vec![
+ // Trig
+ ("sine", "sinus z x"),
+ ("cosine", "cosinus z x"),
+ ("tangent", "tangens z x"),
+ ("secant", "sekans z x"),
+ ("cosecant", "kosekans z x"),
+ ("cotangent", "cotangens z x"),
+
+ // Inverse trig
+ ("arcsine", "arcus sinus z x"),
+ ("arccosine", "arcus cosinus z x"),
+ ("arctangent", "arcus tangens z x"),
+ ("arcsecant", "arcus sekans z x"),
+ ("arccosecant", "arcus kosekans z x"),
+ ("arccotangent", "arcus cotangens z x"),
+
+ // Hyperbolic trig
+ ("hyperbolic-sine", "sinus hiperboliczny z x"),
+ ("hyperbolic-cosine", "cosinus hiperboliczny z x"),
+ ("hyperbolic-tangent", "tangens hiperboliczny z x"),
+ ("hyperbolic-secant", "sekans hiperboliczny z x"),
+ ("hyperbolic-cosecant", "kosekans hiperboliczny z x"),
+ ("hyperbolic-cotangent", "cotangens hiperboliczny z x"),
+
+ // Inverse hyperbolic trig
+ ("arc-hyperbolic-sine", "arcus sinus hiperboliczny z x"),
+ ("arc-hyperbolic-cosine", "arcus cosinus hiperboliczny z x"),
+ ("arc-hyperbolic-tangent", "arcus tangens hiperboliczny z x"),
+ ("arc-hyperbolic-secant", "arcus sekans hiperboliczny z x"),
+ ("arc-hyperbolic-cosecant", "arcus kosekans hiperboliczny z x"),
+ ("arc-hyperbolic-cotangent", "arcus cotangens hiperboliczny z x"),
+ ];
+
+ for (intent, expected) in tests {
+ let expr = format!(
+ "",
+ intent
+ );
+
+ test("pl", "ClearSpeak", &expr, expected)?;
+ }
+
+ Ok(())
+}
+
+#[test]
+fn statistics_and_probability_tests() -> Result<()> {
+ let tests = vec![
+ ("mean", "średnia z x"),
+ ("standard-deviation", "odchylenie standardowe z x"),
+ ("variance", "wariancja z x"),
+ ("median", "mediana z x"),
+ ("mode", "dominanta z x"),
+
+ // conditional probability typically two arguments
+ // ("conditional-probability", "probability of x given y"),
+ ];
+
+ for (intent, expected) in tests {
+ let expr = match intent {
+ "conditional-probability" => format!(
+ "",
+ intent
+ ),
+ _ => format!(
+ "",
+ intent
+ ),
+ };
+
+ test("pl", "ClearSpeak", &expr, expected)?;
+ }
+
+ Ok(())
+}
+
+#[test]
+fn linear_algebra_tests() -> Result<()> {
+ let tests = vec![
+ ("vector", "wektor z x"),
+ // ("matrix", "matrix of x"),
+ ("determinant", "wyznacznik z x"),
+ ("adjugate", "macierz dopełnień algebraicznych z x"),
+ ("magnitude", "długość z x"),
+ ("norm", "norma z x"),
+ ("span", "powłoka liniowa z x"),
+
+ // transpose supports both postfix and function; we test function explicitly
+ ("transpose", "transpozycja z x"),
+
+ // dimensional product is infix
+ ("dimensional-product", "x na y"),
+
+ // unit-vector is prefix
+ ("unit-vector", "wektor jednostkowy x")
+ ];
+
+ for (intent, expected) in tests {
+ let expr: String = match intent {
+ "dimensional-product" => {
+ ""
+ .to_string()
+ }
+ _ => format!(
+ ""
+ ),
+ };
+
+ test("pl", "ClearSpeak", &expr, expected)?;
+ }
+
+ Ok(())
+}
+
+#[test]
+fn nofix_set_tests() -> Result<()> {
+ let tests = vec![
+ ("set-of-integers", "ℤ", "zbiór liczb całkowitych"),
+ ("set-of-reals", "ℝ", "zbiór liczb rzeczywistych"),
+ ("set-of-rationals", "ℚ", "zbiór liczb wymiernych"),
+ ("set-of-natural-numbers", "ℕ", "zbiór liczb naturalnych"),
+ ("set-of-complex-numbers", "ℂ", "zbiór liczb zespolonych"),
+ ("set-of-primes", "ℙ", "zbiór liczb pierwszych"),
+ ];
+
+ for (intent, symbol, expected) in tests {
+ let expr = format!(
+ "",
+ intent,
+ symbol
+ );
+
+ test("pl", "ClearSpeak", &expr, expected)?;
+ }
+
+ Ok(())
+}
+
+#[test]
+fn geometry_prefix_multi_value_tests() -> Result<()> {
+ let tests = vec![
+ ("line-segment", "odcinek x y"),
+ ("directed-line-segment", "odcinek skierowany x y"),
+ ("line", "linia x y"),
+ ("ray", "półprosta x y"),
+ ("arc", "łuk x y"),
+ ("point", "punkt x y z"),
+ ];
+
+ for (intent, expected) in tests {
+ let expr = match intent{
+ "point" => {
+ format!(
+ ""
+ )
+ }
+
+ _ => {
+ format!(
+ ""
+ )
+ }
+ };
+
+ test("pl", "ClearSpeak", &expr, expected)?;
+ }
+
+ Ok(())
+}
+
+#[test]
+fn geometry_prefix_tests() -> Result<()> {
+ let tests = vec![
+ ("length", "długość z x"),
+ ("area", "pole z x"),
+ ("objętość", "objętość z x"),
+ ];
+
+ for (intent, expected) in tests {
+ let expr = format!(
+ ""
+ );
+
+ test("pl", "ClearSpeak", &expr, expected)?;
+ }
+
+ Ok(())
+}
+
+#[test]
+fn separator_tests() -> Result<()> {
+ let expr = format!(
+ ""
+ );
+
+ test("pl", "ClearSpeak", &expr, "x y")?;
+ Ok(())
+}
+
+#[test]
+fn general_concepts_tests() -> Result<()> {
+ let tests = vec![
+ // Unary structural
+ ("fenced-group", "grupa w nawiasach z x"),
+ ("highlight", "x podświetlone"),
+ ("least-common-denominator", "najmniejszy wspólny mianownik z x przecinek, y przecinek, z"), // add x, y , z ...
+ ("pochhammer", "symbol Pochhammera z x"),
+ ("permutation-cycle", "cykl permutacji z x"),
+
+ // Binary structural / infix-style
+ // ("ordered-pair", "the pair of x and y"),
+ ("rate", "x na y"),
+
+ ("binomial-coefficient", "x po y"),
+ ("embellished-name", "x z oznaczeniem y"),
+ ("indexed-by", "x indeks dolny y"),
+ // ("translation", "translation by x comma, y"), // Changes translation to comma
+ ("constraint", "x przy warunku y"),
+ ];
+
+ for (intent, expected) in tests {
+ let expr = match intent {
+ "ordered-pair"
+ | "rate"
+ | "constraint"
+ | "binomial-coefficient"
+ | "embellished-name"
+ | "translation"
+ | "indexed-by" => {
+ format!(
+ "",
+ intent
+ )
+ }
+ "least-common-denominator" => {
+ format!(
+ "",
+ intent
+ )
+ }
+
+ // unary cases
+ _ => {
+ format!(
+ "",
+ intent
+ )
+ }
+ };
+
+ test("pl", "ClearSpeak", &expr, expected)?;
+ }
+
+ Ok(())
+}
+
+#[test]
+fn grouping_tests() -> Result<()> {
+ let tests = vec![
+ ("annotation", "x czyli y"),
+ // ("braced-group", "grouped x end-grouped"),
+ // ("repeating-decimal", "repeating decimal of x"),
+ ];
+
+ for (intent, expected) in tests {
+ let expr = match intent {
+ "annotation" => {
+ format!(
+ "",
+ intent
+ )
+ }
+ _ => {
+ format!(
+ "",
+ intent
+ )
+ }
+ };
+
+ test("pl", "ClearSpeak", &expr, expected)?;
+ }
+
+ Ok(())
+}
+
+#[test]
+fn function_default_fixity_tests() -> Result<()> {
+ let tests = vec![
+ ("curl", "rotacja z x"),
+ ("divergence", "dywergencja z x"),
+ ("gradient", "gradient z x"),
+ ("laplacian", "laplasjan z x"),
+ ];
+
+ for (intent, expected) in tests {
+ let expr = format!(
+ "",
+ intent
+ );
+
+ test("pl", "ClearSpeak", &expr, expected)?;
+ }
+
+ Ok(())
+}
+
+#[test]
+fn prefix_default_fixity_tests() -> Result<()> {
+ let tests = vec![
+ ("angle", "kąt x"),
+ ("angle-measure", "miara kąta x"),
+ ("change", "zmiana x"),
+ ("for-all", "dla każdego x"),
+ ("measured-angle", "kąt mierzony x"),
+ ("not", "nie x"),
+ ("number-of", "liczba x"),
+ ("partial-derivative", "cząstkowe x"),
+ ("right-angle", "kąt prosty x"),
+ ("square-root-of", "pierwiastek kwadratowy z x"),
+ ("there-does-not-exist", "nie istnieje x"),
+ ("there-exists", "istnieje x"),
+ ];
+
+ for (intent, expected) in tests {
+ let expr = format!(
+ "",
+ intent
+ );
+
+ test("pl", "ClearSpeak", &expr, expected)?;
+ }
+
+ Ok(())
+}
+
+#[test]
+fn infix_default_fixity_tests() -> Result<()> {
+ let tests = vec![
+ ("and", "x i y"),
+ ("applied-to", "x zastosowane do y"),
+ ("approximately", "x w przybliżeniu y"),
+ ("congruent", "x przystające do y"),
+ ("cartesian-product", "x iloczyn kartezjański y"),
+ ("composed-with", "x złożone z y"),
+ ("cross-product", "x iloczyn wektorowy y"),
+ ("defined-as", "x zdefiniowane jako y"),
+ ("divided-by", "x podzielone przez y"),
+ ("divides", "x dzieli y"),
+ ("does-not-belong-to", "x nie należy do y"),
+ ("does-not-divide", "x nie dzieli y"),
+ ("dot-product", "x iloczyn skalarny y"),
+ ("downwards-diagonal-ellipsis", "x ukośny wielokropek w dół y"),
+ ("direct-product", "x iloczyn prosty y"),
+ ("element-of", "x należy do y"),
+ ("ellipsis", "x wielokropek y"),
+ ("equals", "x równa się y"),
+ ("equivalent-to", "x równoważne y"),
+ ("evaluates-to", "x ma wartość y"),
+ ("given", "x pod warunkiem y"),
+ ("greater-than", "x większe niż y"),
+ ("greater-than-or-equal-to", "x większe lub równe y"),
+ ("identically-equals", "x tożsamościowo równe y"),
+ ("if-and-only-if", "x wtedy i tylko wtedy gdy y"),
+ ("implies", "x implikuje y"),
+ ("inner-product", "x iloczyn wewnętrzny y"),
+ ("intersection", "x część wspólna y"),
+ ("less-than", "x mniejsze niż y"),
+ ("less-than-or-equal-to", "x mniejsze lub równe y"),
+ ("list-separator", "x przecinek y"),
+ ("maps-to", "x przekształca na y"),
+ ("member-of", "x element zbioru y"),
+ ("minus", "x minus y"),
+ ("minus-or-plus", "x minus lub plus y"),
+ ("not-subset", "x nie jest podzbiorem y"),
+ ("not-superset", "x nie jest nadzbiorem y"),
+ ("not-equal-to", "x nie równa się y"),
+ ("not-member-of", "x nie jest elementem zbioru y"),
+ ("not-parallel-to", "x nierównoległe do y"),
+ ("obtained-from", "x otrzymane z y"),
+ ("or", "x lub y"),
+ ("outer-product", "x iloczyn zewnętrzny y"),
+ ("parallel-to", "x równoległe do y"),
+ ("perpendicular", "x prostopadłe do y"),
+ ("plus", "x plus y"),
+ ("plus-or-minus", "x plus minus y"),
+ ("precedes", "x poprzedza y"),
+ ("proportional", "x proporcjonalne do y"),
+ ("range-separator", "x do y"),
+ ("ratio", "x stosunek y"),
+ ("similar", "x podobne do y"),
+ ("subset", "x podzbiór y"),
+ ("subset-or-equal", "x podzbiór lub równy y"),
+ ("succeeds", "x następuje po y"),
+ ("such-that", "x taki że y"),
+ ("superset", "x nadzbiór y"),
+ ("superset-or-equal", "x nadzbiór lub równy y"),
+ ("tilde", "x tylda y"),
+ ("times", "x razy y"),
+ ("union", "x suma zbiorów y"),
+ ("upwards-diagonal-ellipsis", "x ukośny wielokropek w górę y"),
+ ("vertical-ellipsis", "x wielokropek pionowy y"),
+ ("xor", "x albo y"),
+ ];
+
+ for (intent, expected) in tests {
+ let expr = format!(
+ "",
+ intent
+ );
+
+ test("pl", "ClearSpeak", &expr, expected)?;
+ }
+
+ Ok(())
+}
+
+#[test]
+fn postfix_default_fixity_tests() -> Result<()> {
+ let tests = vec![
+ ("factorial", "x silnia"),
+ ("percent", "x procent"),
+ ];
+
+ for (intent, expected) in tests {
+ let expr = format!(
+ "",
+ intent
+ );
+
+ test("pl", "ClearSpeak", &expr, expected)?;
+ }
+
+ Ok(())
+}
+
+#[test]
+fn nofix_default_fixity_tests() -> Result<()> {
+ let tests = vec![
+ ("średnica", "d", "średnica"),
+ ("odległość", "D", "odległość"),
+ ("prawdopodobieństwo", "P", "prawdopodobieństwo"),
+ ("promień", "r", "promień"),
+ ("objętość", "V", "objętość"),
+ ("exponential-e", "e", "e"),
+ ("imaginary-i", "i", "i"),
+ ("differential-d", "d", "d"),
+ ("golden-ratio", "φ", "złota proporcja"),
+ ];
+
+ for (intent, symbol, expected) in tests {
+ let expr = format!(
+ "",
+ intent,
+ symbol
+ );
+
+ test("pl", "ClearSpeak", &expr, expected)?;
+ }
+
+ Ok(())
+}
\ No newline at end of file
diff --git a/tests/Languages/pl/mtable.rs b/tests/Languages/pl/mtable.rs
new file mode 100644
index 00000000..8403eeae
--- /dev/null
+++ b/tests/Languages/pl/mtable.rs
@@ -0,0 +1,1296 @@
+use crate::common::*;
+use anyhow::Result;
+
+#[test]
+fn matrix_1x1() -> Result<()> {
+ let expr = "
+
+ ";
+ test("pl", "ClearSpeak", expr, "jeden na jeden macierz z elementem 3")?;
+ test("pl", "SimpleSpeak", expr, "jeden na jeden macierz z elementem 3")?;
+ return Ok(());
+
+}
+
+#[test]
+fn determinant_1x1() -> Result<()> {
+ let expr = "
+
+ ";
+ test("pl", "ClearSpeak", expr, "jeden na jeden wyznacznik z elementem 3")?;
+ test("pl", "SimpleSpeak", expr, "jeden na jeden wyznacznik z elementem 3")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn matrix_1x2() -> Result<()> {
+ let expr = "
+
+ ";
+ test("pl", "ClearSpeak", expr, "jeden na 2 wiersz macierz; 3, 5")?;
+ test("pl", "SimpleSpeak", expr, "jeden na 2 wiersz macierz; 3, 5")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn matrix_1x3() -> Result<()> {
+ let expr = "
+
+ ";
+ test("pl", "ClearSpeak", expr, "jeden na 3 wiersz macierz; minus x, 5, 12")?;
+ test("pl", "SimpleSpeak", expr, "jeden na 3 wiersz macierz; minus x, 5, 12")?;
+ return Ok(());
+
+}
+
+#[test]
+fn matrix_2x1_not_simple() -> Result<()> {
+ let expr = "
+
+ ";
+ test("pl", "ClearSpeak", expr, "2 na jedną kolumnę macierz; wiersz 1; x plus 1; wiersz 2; x minus 1")?;
+ test("pl", "SimpleSpeak", expr, "2 na jedną kolumnę macierz; wiersz 1; x plus 1; wiersz 2; x minus 1")?;
+ return Ok(());
+
+}
+#[test]
+fn matrix_3x1_not_simple() -> Result<()> {
+ let expr = "
+ ";
+ test("pl", "SimpleSpeak", expr, "3 na jedną kolumnę macierz; wiersz 1; x; wiersz 2; a; wiersz 3; ułamek, x przez, x plus 1, koniec ułamka")?;
+ test("pl", "ClearSpeak", expr, "3 na jedną kolumnę macierz; wiersz 1; x; wiersz 2; a; wiersz 3; ułamek z licznikiem x; i mianownikiem x plus 1")?;
+ return Ok(());
+
+}
+
+#[test]
+fn determinant_2x2() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "2 na 2 wyznacznik; wiersz 1; 2, 1; wiersz 2; 7, 5")?;
+ test("pl", "SimpleSpeak", expr, "2 na 2 wyznacznik; wiersz 1; 2, 1; wiersz 2; 7, 5")?;
+ return Ok(());
+
+}
+
+#[test]
+fn matrix_2x3() -> Result<()> {
+ let expr = "
+
+ ";
+ test("pl", "ClearSpeak", expr, "2 na 3 macierz; wiersz 1; 3, 1, 4; wiersz 2; 0, 2, 6")?;
+ test("pl", "SimpleSpeak", expr, "2 na 3 macierz; wiersz 1; 3, 1, 4; wiersz 2; 0, 2, 6")?;
+ return Ok(());
+
+}
+
+#[test]
+fn augmented_matrix_2x3() -> Result<()> {
+ let expr = "
+
+ ";
+ test("pl", "ClearSpeak", expr, "2 na 3 macierz rozszerzona; wiersz 1; 3, 1, 4; wiersz 2; 0, 2, 6")?;
+ test("pl", "SimpleSpeak", expr, "2 na 3 macierz rozszerzona; wiersz 1; 3, 1, 4; wiersz 2; 0, 2, 6")?;
+ Ok(())
+}
+
+#[test]
+fn matrix_2x3_labeled() -> Result<()> {
+ let expr = "
+
+ ";
+ test("pl", "ClearSpeak", expr,
+ "2 na 3 macierz; wiersz 1 z etykietą (3.1); kolumna 1; 3, kolumna 2; 1, kolumna 3; 4; wiersz 2; kolumna 1; 0, kolumna 2; 2, kolumna 3; 6")?;
+ test("pl", "SimpleSpeak", expr,
+ "2 na 3 macierz; wiersz 1 z etykietą (3.1); kolumna 1; 3, kolumna 2; 1, kolumna 3; 4; wiersz 2; kolumna 1; 0, kolumna 2; 2, kolumna 3; 6")?;
+ return Ok(());
+
+}
+
+#[test]
+fn matrix_3x1() -> Result<()> {
+ let expr = "
+
+ ";
+ test("pl", "ClearSpeak", expr, "3 na jedną kolumnę macierz; 1; 2; 3")?;
+ test("pl", "SimpleSpeak", expr, "3 na jedną kolumnę macierz; 1; 2; 3")?;
+ return Ok(());
+
+}
+
+#[test]
+fn matrix_4x1() -> Result<()> {
+ let expr = "
+
+ ";
+ test("pl", "ClearSpeak", expr, "4 na jedną kolumnę macierz; wiersz 1; 3; wiersz 2; 6; wiersz 3; 1; wiersz 4; 2")?;
+ test("pl", "SimpleSpeak", expr, "4 na jedną kolumnę macierz; wiersz 1; 3; wiersz 2; 6; wiersz 3; 1; wiersz 4; 2")?;
+ return Ok(());
+
+}
+
+#[test]
+fn matrix_4x1_labeled() -> Result<()> {
+ let expr = "
+
+ ";
+ test("pl", "ClearSpeak", expr,
+ "4 na jedną kolumnę macierz; wiersz 1; 3; wiersz 2; 6; wiersz 3; 1; wiersz 4 z etykietą (3.1); 2")?;
+ test("pl", "SimpleSpeak", expr,
+ "4 na jedną kolumnę macierz; wiersz 1; 3; wiersz 2; 6; wiersz 3; 1; wiersz 4 z etykietą (3.1); 2")?;
+ return Ok(());
+
+}
+
+#[test]
+fn matrix_1x4() -> Result<()> {
+ let expr = "
+
+ ";
+ test("pl", "ClearSpeak", expr, "jeden na 4 wiersz macierz; kolumna 1; 3, kolumna 2; 6, kolumna 3; 1, kolumna 4; 2")?;
+ test("pl", "SimpleSpeak", expr, "jeden na 4 wiersz macierz; kolumna 1; 3, kolumna 2; 6, kolumna 3; 1, kolumna 4; 2")?;
+ return Ok(());
+
+}
+
+#[test]
+fn matrix_4x4() -> Result<()> {
+ let expr = "
+
+ ";
+ test("pl", "ClearSpeak", expr, "4 na 4 macierz; wiersz 1; kolumna 1; 0, kolumna 2; 3, kolumna 3; 4, kolumna 4; 3; wiersz 2; kolumna 1; 2, kolumna 2; 1, kolumna 3; 0, kolumna 4; 9; wiersz 3; kolumna 1; 3, kolumna 2; 0, kolumna 3; 2, kolumna 4; 1; wiersz 4; kolumna 1; 6, kolumna 2; 2, kolumna 3; 9, kolumna 4; 0")?;
+ test("pl", "SimpleSpeak", expr, "4 na 4 macierz; wiersz 1; kolumna 1; 0, kolumna 2; 3, kolumna 3; 4, kolumna 4; 3; wiersz 2; kolumna 1; 2, kolumna 2; 1, kolumna 3; 0, kolumna 4; 9; wiersz 3; kolumna 1; 3, kolumna 2; 0, kolumna 3; 2, kolumna 4; 1; wiersz 4; kolumna 1; 6, kolumna 2; 2, kolumna 3; 9, kolumna 4; 0")?;
+ return Ok(());
+}
+
+#[test]
+fn matrix_4x2() -> Result<()> {
+ let expr = "
+
+ ";
+ test("pl", "ClearSpeak", expr, "4 na 2 macierz; wiersz 1; kolumna 1; 1, kolumna 2; 3; wiersz 2; kolumna 1; 4, kolumna 2; 2; wiersz 3; kolumna 1; 2, kolumna 2; 1; wiersz 4; kolumna 1; 0, kolumna 2; 5")?;
+ test("pl", "SimpleSpeak", expr, "4 na 2 macierz; wiersz 1; kolumna 1; 1, kolumna 2; 3; wiersz 2; kolumna 1; 4, kolumna 2; 2; wiersz 3; kolumna 1; 2, kolumna 2; 1; wiersz 4; kolumna 1; 0, kolumna 2; 5")?;
+ return Ok(());
+}
+
+// put absolute value test here since it is related to determinate and is small for its own file
+#[test]
+fn simple_absolute_value() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "wartość bezwzględna z x")?;
+ test("pl", "ClearSpeak", expr, "wartość bezwzględna z x")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Terse"), ("ClearSpeak_AbsoluteValue", "Auto")], expr, "wartość bezwzględna z x")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Verbose"), ("ClearSpeak_AbsoluteValue", "AbsEnd")],
+ expr, "wartość bezwzględna z x, koniec wartości bezwzględnej")?;
+ return Ok(());
+}
+
+#[test]
+fn absolute_value_plus_1() -> Result<()> {
+let expr = "";
+ test("pl", "ClearSpeak", expr, "wartość bezwzględna z x plus 1")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Terse"), ("ClearSpeak_AbsoluteValue", "AbsEnd")],
+ expr, "wartość bezwzględna z x plus 1, koniec wartości bezwzględnej")?;
+ return Ok(());
+}
+
+#[test]
+fn simple_cardinality_value() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium"), ("ClearSpeak_AbsoluteValue", "Cardinality")], expr,
+ "moc z wielka s")?;
+ return Ok(());
+}
+
+// Test preferences
+#[test]
+fn simple_matrix_speak_col_num() -> Result<()> {
+let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_Matrix", "SpeakColNum",
+ expr, "2 na 2 macierz; wiersz 1; kolumna 1; 2, kolumna 2; 1; wiersz 2; kolumna 1; 7, kolumna 2; 5")?;
+ return Ok(());
+}
+
+#[test]
+fn col_matrix_3x1_speak_col_num() -> Result<()> {
+let expr = "";
+test_ClearSpeak("pl", "ClearSpeak_Matrix", "SpeakColNum",
+ expr, "3 na jedną kolumnę macierz; wiersz 1; 1; wiersz 2; 2; wiersz 3; 3")?;
+ return Ok(());
+}
+
+#[test]
+fn row_matrix_1x2_speak_col_num() -> Result<()> {
+let expr = "";
+test_ClearSpeak("pl", "ClearSpeak_Matrix", "SpeakColNum",
+ expr, "jeden na 2 wiersz macierz; kolumna 1; 1, kolumna 2; 2")?;
+ return Ok(());
+}
+
+#[test]
+fn matrix_2x2_speak_col_num() -> Result<()> {
+let expr = "";
+test_ClearSpeak("pl", "ClearSpeak_Matrix", "SpeakColNum",
+ expr, "2 na 2 macierz; wiersz 1; kolumna 1; b indeks dolny 1 1; kolumna 2; b indeks dolny 1 2; wiersz 2; kolumna 1; b indeks dolny 2 1; kolumna 2; b indeks dolny 2 2")?;
+ return Ok(());
+}
+
+
+#[test]
+fn simple_matrix_silent_col_num() -> Result<()> {
+let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_Matrix", "SilentColNum",
+ expr, "2 na 2 macierz; wiersz 1; 2, 1; wiersz 2; 7, 5")?;
+ return Ok(());
+}
+
+#[test]
+fn col_matrix_3x1_silent_col_num() -> Result<()> {
+let expr = "";
+test_ClearSpeak("pl", "ClearSpeak_Matrix", "SilentColNum",
+ expr, "3 na jedną kolumnę macierz; 1; 2; 3")?;
+ return Ok(());
+}
+
+#[test]
+fn row_matrix_1x2_silent_col_num() -> Result<()> {
+let expr = "";
+test_ClearSpeak("pl", "ClearSpeak_Matrix", "SilentColNum",
+ expr, "jeden na 2 wiersz macierz; 1, 2")?;
+ return Ok(());
+}
+
+#[test]
+fn matrix_2x2_silent_col_num() -> Result<()> {
+let expr = "";
+test_ClearSpeak("pl", "ClearSpeak_Matrix", "SilentColNum",
+ expr, "2 na 2 macierz; wiersz 1; b indeks dolny 1 1; b indeks dolny 1 2; wiersz 2; b indeks dolny 2 1; b indeks dolny 2 2")?;
+ return Ok(());
+ }
+
+
+#[test]
+fn simple_matrix_end_matrix() -> Result<()> {
+let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_Matrix", "EndMatrix",
+ expr, "2 na 2 macierz; wiersz 1; 2, 1; wiersz 2; 7, 5; koniec macierzy")?;
+ return Ok(());
+ }
+
+#[test]
+fn col_matrix_3x1_end_matrix() -> Result<()> {
+let expr = "";
+test_ClearSpeak("pl", "ClearSpeak_Matrix", "EndMatrix",
+ expr, "3 na jedną kolumnę macierz; 1; 2; 3; koniec macierzy")?;
+ return Ok(());
+ }
+
+#[test]
+fn row_matrix_1x2_end_matrix() -> Result<()> {
+let expr = "";
+test_ClearSpeak("pl", "ClearSpeak_Matrix", "EndMatrix",
+ expr, "jeden na 2 wiersz macierz; 1, 2; koniec macierzy")?;
+ return Ok(());
+ }
+
+#[test]
+fn matrix_2x2_end_matrix() -> Result<()> {
+let expr = "";
+test_ClearSpeak("pl", "ClearSpeak_Matrix", "EndMatrix",
+ expr, "2 na 2 macierz; wiersz 1; kolumna 1; b indeks dolny 1 1; kolumna 2; b indeks dolny 1 2; wiersz 2; kolumna 1; b indeks dolny 2 1; kolumna 2; b indeks dolny 2 2; koniec macierzy")?;
+ return Ok(());
+ }
+
+#[test]
+fn augmented_matrix_3x4_end_matrix() -> Result<()> {
+let expr = "";
+test_ClearSpeak("pl", "ClearSpeak_Matrix", "EndMatrix",
+ expr, "3 na 4 macierz rozszerzona; wiersz 1; kolumna 1; 1, kolumna 2; 2, kolumna 3; minus 1, kolumna 4; 3; wiersz 2; kolumna 1; minus 3, kolumna 2; 3, kolumna 3; minus 1, kolumna 4; 2; wiersz 3; kolumna 1; 2, kolumna 2; 3, kolumna 3; 2, kolumna 4; minus 1; koniec macierzy")?;
+ test("pl", "SimpleSpeak",
+ expr, "3 na 4 macierz rozszerzona; wiersz 1; kolumna 1; 1, kolumna 2; 2, kolumna 3; minus 1, kolumna 4; 3; wiersz 2; kolumna 1; minus 3, kolumna 2; 3, kolumna 3; minus 1, kolumna 4; 2; wiersz 3; kolumna 1; 2, kolumna 2; 3, kolumna 3; 2, kolumna 4; minus 1; koniec macierzy")?;
+ Ok(())
+ }
+
+
+#[test]
+fn simple_matrix_vector() -> Result<()> {
+let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_Matrix", "Vector",
+ expr, "2 na 2 macierz; wiersz 1; 2, 1; wiersz 2; 7, 5")?;
+ return Ok(());
+ }
+
+#[test]
+fn col_matrix_3x1_vector() -> Result<()> {
+let expr = "";
+test_ClearSpeak("pl", "ClearSpeak_Matrix", "Vector",
+ expr, "3 na jedną kolumnę wektor; 1; 2; 3")?;
+ return Ok(());
+ }
+
+#[test]
+fn row_matrix_1x2_vector() -> Result<()> {
+let expr = "";
+test_ClearSpeak("pl", "ClearSpeak_Matrix", "Vector",
+ expr, "jeden na 2 wiersz wektor; 1, 2")?;
+ return Ok(());
+ }
+
+#[test]
+fn matrix_2x2_vector() -> Result<()> {
+let expr = "";
+test_ClearSpeak("pl", "ClearSpeak_Matrix", "Vector",
+ expr, "2 na 2 macierz; wiersz 1; kolumna 1; b indeks dolny 1 1; kolumna 2; b indeks dolny 1 2; wiersz 2; kolumna 1; b indeks dolny 2 1; kolumna 2; b indeks dolny 2 2")?;
+ return Ok(());
+ }
+
+
+#[test]
+fn simple_matrix_end_vector() -> Result<()> {
+let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_Matrix", "EndVector",
+ expr, "2 na 2 macierz; wiersz 1; 2, 1; wiersz 2; 7, 5; koniec macierzy")?;
+ return Ok(());
+ }
+
+#[test]
+fn col_matrix_3x1_end_vector() -> Result<()> {
+let expr = "";
+test_ClearSpeak("pl", "ClearSpeak_Matrix", "EndVector",
+ expr, "3 na jedną kolumnę wektor; 1; 2; 3; koniec wektora")?;
+ return Ok(());
+ }
+
+#[test]
+fn row_matrix_1x2_end_vector() -> Result<()> {
+let expr = "";
+test_ClearSpeak("pl", "ClearSpeak_Matrix", "EndVector",
+ expr, "jeden na 2 wiersz wektor; 1, 2; koniec wektora")?;
+ return Ok(());
+ }
+
+#[test]
+fn matrix_2x2_end_vector() -> Result<()> {
+let expr = "";
+test_ClearSpeak("pl", "ClearSpeak_Matrix", "EndVector",
+ expr, "2 na 2 macierz; wiersz 1; kolumna 1; b indeks dolny 1 1; kolumna 2; b indeks dolny 1 2; wiersz 2; kolumna 1; b indeks dolny 2 1; kolumna 2; b indeks dolny 2 2; koniec macierzy")?;
+ return Ok(());
+}
+
+
+#[test]
+fn matrix_binomial() -> Result<()> {
+ let expr = "";
+ test_ClearSpeak("pl", "ClearSpeak_Matrix", "Combinatorics", expr, "3 po 2")?;
+ return Ok(());
+}
+
+#[test]
+fn matrix_simple_table() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "tablica z; wiersz 1; kolumna 1; 3; przecinek; wiersz 2; kolumna 1; 2")
+}
+
+#[test]
+fn mtable_prefix_op() -> Result<()>{
+ // When a table is prefixed with a non-blank operator, assume it is something besides array intent
+ for (op, expected) in [("(", "nawias otwierający, 2 linie; linia 1; 3; linia 2; 2"),
+ ("[", "nawias kwadratowy otwierający; 2 linie; linia 1; 3; linia 2; 2"),
+ ("|", "kreska pionowa, 2 linie; linia 1; 3; linia 2; 2"),
+ ("f", "f, 2 linie; linia 1; 3; linia 2; 2")] {
+ let expr = format!("");
+ test("pl", "ClearSpeak", &expr, expected)?;
+ }
+ Ok(())
+}
+
+#[test]
+fn mtable_blank_op() -> Result<()>{
+ // When a table is prefixed with a blank operator, still assume array intent
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "; tablica z; wiersz 1; kolumna 1; 3; przecinek; wiersz 2; kolumna 1; 2")
+}
+
+
+
+#[test]
+fn mtable_colspan_table() -> Result<()>{
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "tablica z; wiersz 1; kolumna 1; 3; przecinek; wiersz 2; kolumna 1; 2, kolumna 2; 4")
+}
+
+#[test]
+fn bug_mtable_rowspan_colspan() -> Result<()>{
+ // Currently, the code correctly computes the number of rows and
+ // columns, but it does not correctly compute the column number whnen
+ // colspans are involved.
+ let expr = "";
+ test("pl", "ClearSpeak", expr,
+ "tablica z; wiersz 1; kolumna 1; a, kolumna 2; b, kolumna 3; c; przecinek; wiersz 2; kolumna 1; d, kolumna 2; e")
+}
+
+
+
+#[test]
+fn matrix_times() {
+ let expr = "";
+ let _ = test("pl", "SimpleSpeak", expr,
+ "2 na 2 macierz; wiersz 1; 1, 2; wiersz 2; 3, 4; razy, 2 na 2 macierz; wiersz 1; a, b; wiersz 2; c, d");
+}
+
+#[test]
+fn unknown_mtable_property() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr,
+ "2 linie; linia 1; a równa się, b plus c minus d; linia 2; plus e minus f")?;
+ return Ok(());
+ }
+
+
+#[test]
+fn zero_matrix() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr,
+ "2 na 2 macierz zerowa")?;
+ return Ok(());
+ }
+
+#[test]
+fn identity_matrix() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr,
+ "3 na 3 macierz jednostkowa")?;
+ return Ok(());
+ }
+
+#[test]
+fn identity_matrix_false_positive_negative_one() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Terse")],
+ expr, "2 na 2 macierz diagonalna; kolumna 1; 1; kolumna 2; minus 1")?;
+ Ok(())
+}
+
+#[test]
+fn identity_matrix_false_positive_zero_diagonal() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Terse")],
+ expr, "2 na 2 macierz diagonalna; kolumna 1; 1")?;
+ Ok(())
+}
+
+#[test]
+fn diagonal_matrix() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Terse")],
+ expr, "3 na 3 macierz diagonalna; kolumna 1; 2; kolumna 2; 1; kolumna 3; x do kwadratu")?;
+ // test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Verbose")],
+ // expr, "the 3 by 3 diagonal matrix; row 1, column 1, 2; row 2, column 2, 1; row 3, column 3, x squared");
+ return Ok(());
+ }
+
+#[test]
+fn single_line_with_label() -> Result<()> {
+ let expr = r#""#;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Terse")],
+ expr, "1 linia, z etykietą 2; b równa się 2")?;
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Terse")],
+ expr, "1 równanie, z etykietą 2; b równa się 2")?;
+ return Ok(());
+ }
diff --git a/tests/Languages/pl/pl.rs b/tests/Languages/pl/pl.rs
index 7c250300..d8297b86 100644
--- a/tests/Languages/pl/pl.rs
+++ b/tests/Languages/pl/pl.rs
@@ -1255,3 +1255,88 @@ fn rownoleglosc_nie_jest_norma() -> Result<()> {
test("pl", "ClearSpeak", expr, "a jest równoległe do b")?;
Ok(())
}
+
+// --- Polska odmiana liczebnika w układach wielowierszowych -------------------
+// Cecha specyficzna dla polskiego: rzeczownik po liczbie odmienia się przez
+// liczbę: 1 -> pojedyncza, 2-4 (oprócz 12-14) -> mianownik l.mn. (paucal),
+// pozostałe -> dopełniacz l.mn. Zwykłe kopiowanie reguł z angielskiego (sufiks
+// "s") dawało "2 równanies" / "5 równania" - te testy pilnują poprawnych form.
+
+// Buduje układ N równań (mtable z N wierszami "x = i").
+fn uklad_rownan(n: usize) -> String {
+ let mut wiersze = String::new();
+ for i in 1..=n {
+ wiersze.push_str(&format!(
+ "x={i}"
+ ));
+ }
+ format!("")
+}
+
+#[test]
+fn simplespeak_uklad_dwa_rownania_paucal() -> Result<()> {
+ // 2 -> "równania" (mianownik l.mn.)
+ test("pl", "SimpleSpeak", &uklad_rownan(2),
+ "2 równania; równanie 1; x równa się 1; równanie 2; x równa się 2")?;
+ Ok(())
+}
+
+#[test]
+fn simplespeak_uklad_piec_rownan_dopelniacz() -> Result<()> {
+ // 5 -> "równań" (dopełniacz l.mn.), NIE "równania"
+ let mowa = get_spoken_text_for(&uklad_rownan(5), "SimpleSpeak");
+ assert!(mowa.starts_with("5 równań;"), "oczekiwano '5 równań;', było: {mowa}");
+ Ok(())
+}
+
+#[test]
+fn simplespeak_uklad_dwanascie_rownan_wyjatek() -> Result<()> {
+ // 12 -> dopełniacz "równań" (wyjątek 12-14, mimo końcówki 2)
+ let mowa = get_spoken_text_for(&uklad_rownan(12), "SimpleSpeak");
+ assert!(mowa.starts_with("12 równań;"), "oczekiwano '12 równań;', było: {mowa}");
+ Ok(())
+}
+
+#[test]
+fn simplespeak_uklad_dwadziescia_dwa_rownania_paucal() -> Result<()> {
+ // 22 -> "równania" (końcówka 2, poza zakresem 12-14)
+ let mowa = get_spoken_text_for(&uklad_rownan(22), "SimpleSpeak");
+ assert!(mowa.starts_with("22 równania;"), "oczekiwano '22 równania;', było: {mowa}");
+ Ok(())
+}
+
+#[test]
+fn clearspeak_uklad_przypadki_odmiana() -> Result<()> {
+ // ClearSpeak, etykieta Case: 5 -> "przypadków", 12 -> "przypadków"
+ for (n, forma) in [(5usize, "5 przypadków;"), (12, "12 przypadków;")] {
+ let mowa = get_spoken_text_cs(&uklad_rownan(n), "Case");
+ assert!(mowa.starts_with(forma), "oczekiwano '{forma}', było: {mowa}");
+ }
+ Ok(())
+}
+
+#[test]
+fn clearspeak_uklad_linie_dopelniacz() -> Result<()> {
+ // ClearSpeak, etykieta Line: 5 -> "linii" (dopełniacz), NIE "linie"
+ let mowa = get_spoken_text_cs(&uklad_rownan(5), "Line");
+ assert!(mowa.starts_with("5 linii;"), "oczekiwano '5 linii;', było: {mowa}");
+ Ok(())
+}
+
+// Pomocnicze: zwróć wypowiedź dla danego MathML/stylu (spójne prefy testowe).
+fn get_spoken_text_for(mathml: &str, style: &str) -> String {
+ set_rules_dir(abs_rules_dir_path()).unwrap();
+ set_preference("Language", "pl").unwrap();
+ set_preference("SpeechStyle", style).unwrap();
+ set_mathml(mathml).unwrap();
+ get_spoken_text().unwrap().split_whitespace().collect::>().join(" ")
+}
+
+fn get_spoken_text_cs(mathml: &str, label: &str) -> String {
+ set_rules_dir(abs_rules_dir_path()).unwrap();
+ set_preference("Language", "pl").unwrap();
+ set_preference("SpeechStyle", "ClearSpeak").unwrap();
+ set_preference("ClearSpeak_MultiLineLabel", label).unwrap();
+ set_mathml(mathml).unwrap();
+ get_spoken_text().unwrap().split_whitespace().collect::>().join(" ")
+}
diff --git a/tests/Languages/pl/shared.rs b/tests/Languages/pl/shared.rs
new file mode 100644
index 00000000..8f42a8f5
--- /dev/null
+++ b/tests/Languages/pl/shared.rs
@@ -0,0 +1,609 @@
+/// Tests for rules shared between various speech styles:
+/// * modified var
+use crate::common::*;
+use anyhow::Result;
+
+#[test]
+fn modified_vars() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr,
+ "a grawis, b tylda, c znak krótkości; b haczek, c grawis; plus r haczek plus; x kropka, y kropka, z diereza, u potrójny kropka; v poczwórny kropka; plus x daszek, plus wektor t")?;
+ return Ok(());
+
+}
+
+#[test]
+fn limit() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "granica gdy x dąży do 0, z, ułamek, sinus z x, przez x, koniec ułamka")?;
+ test_prefs("pl", "SimpleSpeak", vec![("Impairment", "LearningDisability")], expr,
+ "granica gdy x dąży do 0, z, sinus z x, przez x")?;
+ return Ok(());
+
+}
+
+#[test]
+fn limit_from_below() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "granica gdy x dąży od dołu 0, z sinus z x")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn binomial_mmultiscripts() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "n po m")?;
+ return Ok(());
+
+}
+
+#[test]
+fn binomial_mmultiscripts_other() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "n po m")?;
+ return Ok(());
+
+}
+
+#[test]
+fn binomial_subscript() -> Result<()> { // C_{n,k}
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "n po m")?;
+ return Ok(());
+
+}
+
+#[test]
+fn permutation_mmultiscripts() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "k permutacji z n")?;
+ return Ok(());
+
+}
+
+#[test]
+fn permutation_mmultiscripts_sup() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "k permutacji z n")?;
+ return Ok(());
+
+}
+
+#[test]
+fn permutation_msubsup() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "k permutacji z n")?;
+ return Ok(());
+
+}
+
+#[test]
+fn tensor_mmultiscripts() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr,
+ "wielka r z 4 prawe indeksy, indeks dolny i indeks górny j indeks dolny k indeks dolny l")?;
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Medium")], expr,
+ "wielka r z 4 prawe indeksy, indeks dolny i indeks górny j indeks dolny k indeks dolny l")?;
+ return Ok(());
+
+}
+
+#[test]
+fn huge_num_mmultiscripts() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr,
+ "wielka r z 4 lewe indeksy, lewy indeks dolny wielka i, lewy indeks górny wielka j i kolejne lewe indeksy wielka k none wielka l none koniec lewych indeksów i z 5 prawe indeksy, indeks dolny i indeks górny j indeks dolny k indeks dolny l i kolejne indeksy m none koniec indeksów")?;
+ return Ok(());
+
+}
+
+#[test]
+fn prime() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "x prim")?;
+ return Ok(());
+
+}
+
+#[test]
+fn given() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "wielka p; nawias otwierający, wielka a pod warunkiem wielka b; nawias zamykający")?;
+ test("pl", "ClearSpeak", expr, "wielka p; nawias otwierający, wielka a pod warunkiem wielka b; nawias zamykający")?; // not good, but follows the spec
+ return Ok(());
+
+}
+
+#[test]
+fn simple_msubsup() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "x indeks dolny k, do potęgi i")?;
+ return Ok(());
+
+}
+
+#[test]
+fn non_simple_msubsup() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "i indeks dolny j minus 2 koniec indeksu dolnego, do potęgi k")?;
+ test("pl", "ClearSpeak", expr, "i indeks dolny j minus 2 koniec indeksu dolnego, do potęgi k")?;
+ test_prefs("pl", "SimpleSpeak", vec![("Impairment", "LearningDisability")], expr,
+ "i indeks dolny j minus 2, do potęgi k")?;
+ return Ok(());
+
+}
+
+#[test]
+fn presentation_mathml_in_semantics() -> Result<()> {
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "x indeks dolny k, do potęgi i")?;
+ return Ok(());
+
+}
+
+#[test]
+fn roman_like_superscript_identifier_is_not_chemistry() -> Result<()> {
+ // Regression test for https://github.com/daisy/MathCAT/issues/528
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "wielka i równa się, minus b r plus z do potęgi wielka i")?;
+ Ok(())
+}
+
+#[test]
+fn roman_like_identifier_sequence_is_not_number() -> Result<()> {
+ // Regression test for https://github.com/daisy/MathCAT/issues/528
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "wielka c plus wielka i plus wielka x")?;
+ Ok(())
+}
+
+
+#[test]
+fn ignore_period() -> Result<()> {
+ // from https://en.wikipedia.org/wiki/Probability
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "wielka p; nawias otwierający, wielka a and wielka b; nawias zamykający; równa się; wielka p; nawias otwierający, wielka a przecięcie wielka b; nawias zamykający; równa się; wielka p z wielka a, wielka p z wielka b")?;
+ return Ok(());
+
+}
+
+#[test]
+fn ignore_mtext_period() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "zbiór 2")?;
+ return Ok(());
+
+}
+
+#[test]
+fn ignore_comma() -> Result<()> {
+ // from https://en.wikipedia.org/wiki/Probability
+ let expr = "";
+ test("pl", "SimpleSpeak", expr, "fi z x równa się; c razy, e do potęgi minus h do kwadratu, x do kwadratu")?;
+ return Ok(());
+
+}
+
+#[test]
+#[ignore] // issue #14
+fn ignore_period_and_space() -> Result<()> {
+ // from https://en.wikipedia.org/wiki/Probability
+ let expr = "";
+ test("pl", "ClearSpeak", expr, "cap p, open paren, cap eigh divides cap b, close paren; is equal to; the fraction with numerator; cap p, open paren, cap eigh intersection cap b; close paren; and denominator cap p of cap b")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn bug_199_2pi() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak",expr, "przedział lewostronnie domknięty prawostronnie otwarty od 0 do 2 pi")?;
+ return Ok(());
+
+}
+
+#[test]
+fn caret_and_hat() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak",expr, "x daszek 2 plus y daszek")?;
+ return Ok(());
+
+}
+
+#[test]
+fn dots() -> Result<()> {
+ let expr = "";
+ test("pl", "SimpleSpeak",expr, "x kropka, plus x .., plus x ...")?;
+ return Ok(());
+}
+
+#[test]
+fn mn_with_space() -> Result<()> {
+ let expr = "";
+ test_prefs("pl", "SimpleSpeak", vec![("DecimalSeparators", "."), ("BlockSeparators", " ,")], expr, "1234567")?;
+ return Ok(());
+
+}
+
+#[test]
+fn ignore_bold() -> Result<()> {
+ let expr = r#""#;
+ test_prefs("pl", "SimpleSpeak", vec![("IgnoreBold", "false")],
+ expr, "pogrubione x równa się, 2 sinus z pogrubione t; minus 1")?;
+ test_prefs("pl", "SimpleSpeak", vec![("IgnoreBold", "true")],
+ expr, "pogrubione x równa się, 2 sinus z pogrubione t; minus 1")?;
+ return Ok(());
+
+}
+
+#[test]
+fn mn_with_block_and_decimal_separators() -> Result<()> {
+ let expr = ""; // may want to change this for another language
+ test_prefs("pl", "SimpleSpeak", vec![("DecimalSeparators", "."), ("BlockSeparators", " ,")], expr, "1234.56")?;
+ return Ok(());
+
+}
+
+#[test]
+fn divergence() -> Result<()> {
+ let expr = ""; // may want to change this for another language
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "dywergencja wielka f")?;
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr, "dywergencja z wielka f")?;
+ return Ok(());
+
+}
+
+#[test]
+fn curl() -> Result<()> {
+ let expr = "";
+ // may want to change this for another language
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "rotacja wielka f")?;
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr, "rotacja z wielka f")?;
+ return Ok(());
+
+}
+
+#[test]
+fn gradient() -> Result<()> {
+ let expr = "";
+ // may want to change this for another language
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Terse")], expr, "gradient wielka f")?;
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr, "gradient z wielka f")?;
+ return Ok(());
+
+}
+
+#[test]
+fn literal_speak_perpendicular() -> Result<()> {
+ let expr = r#""#;
+ test("pl", "LiteralSpeak", expr, "wielka a strzałka w prawo, perpendicular to, wielka b strzałka w prawo")?;
+ return Ok(());
+
+}
+
+#[test]
+fn literal_speak_chars() -> Result<()> {
+ let expr = r#""#;
+ test("pl", "LiteralSpeak", expr, "kreska pionowa; x krzyż, y kropka z ukośnik 2; plus a; podwójna pionowa kreska, b plus x wykrzyknik; kreska pionowa")?;
+ return Ok(());
+
+}
+
+#[test]
+fn literal_speak_with_name() -> Result<()> {
+ let expr = r#""#;
+ test("pl", "LiteralSpeak", expr, "forced f, lewy nawias x wykrzyknik, prawy nawias")?;
+ return Ok(());
+
+}
+
+#[test]
+fn literal_speak_with_property() -> Result<()> {
+ let expr = r#""#;
+ test("pl", "LiteralSpeak", expr, "f, lewy nawias x wykrzyknik, prawy nawias")?;
+ return Ok(());
+
+}
+
+#[test]
+fn literal_intent_property() -> Result<()> {
+ let expr = r#""#;
+ test("pl", "SimpleSpeak", expr, "wielka a strzałka w prawo, perpendicular to, wielka b strzałka w prawo")?;
+ return Ok(());
+
+}
+
+#[test]
+fn literal_intent_property_with_name() -> Result<()> {
+ let expr = r#""#;
+ test("pl", "SimpleSpeak", expr, "forced f, nawias otwierający, x wykrzyknik, nawias zamykający")?;
+ return Ok(());
+
+}
diff --git a/tests/Languages/pl/units.rs b/tests/Languages/pl/units.rs
new file mode 100644
index 00000000..1676cf8a
--- /dev/null
+++ b/tests/Languages/pl/units.rs
@@ -0,0 +1,382 @@
+/// Tests for rules shared between various speech styles:
+/// * modified var
+use crate::common::*;
+use anyhow::Result;
+
+// The basic layout of the tests is:
+// 1. Sweep through all the SI prefixes
+// 2. Sweep through each group of SI units
+// a) with both singular and plural without prefixes
+// b) with both singular and plural with one prefix
+// 3. Sweep through each group of units that don't take SI prefixes
+// These are broken into chunks so it is easier to see errors, when there are errors
+
+#[test]
+fn prefix_sweep() -> Result<()> {
+ let expr = r#""#;
+ test("pl", "SimpleSpeak", expr,
+ "kwetta-grams, przecinek; ronna-grams, przecinek; jotta-grams, przecinek; zetta-grams, przecinek; eksa-grams, przecinek; peta-grams, przecinek; tera-grams, przecinek; giga-grams, przecinek; mega-grams, przecinek; kilo-grams, przecinek; hekto-grams, przecinek; deka-grams, przecinek; decy-grams, przecinek; centy-grams, przecinek; mili-grams, przecinek; mikro-grams, przecinek; nano-grams, przecinek; piko-grams, przecinek; femto-grams, przecinek; atto-grams, przecinek; zepto-grams, przecinek; jokto-grams, przecinek; ronto-grams, przecinek; kwekto-grams")?;
+ return Ok(());
+
+}
+
+#[test]
+fn si_base() -> Result<()> {
+ let expr = r#""#;
+ test("pl", "SimpleSpeak", expr,
+ "1 amper, przecinek; 2 ampers, przecinek; 1 kandela, przecinek; 2 kandelas, przecinek; 1 kelwin, przecinek; 2 kelwins, przecinek; 1 kelwin, przecinek; 2 kelwins, przecinek; 1 gram, przecinek; 2 grams, przecinek; 1 metr, przecinek; 2 metrs, przecinek, 1 mol, przecinek; 2 mols, przecinek; 1 sekunda, przecinek; 2 sekundas, przecinek; 1 sekunda, przecinek; 2 sekundas, przecinek; 1 sekunda, przecinek; 2 sekundas, przecinek; 1 sekunda, przecinek; 2 sekundas")?;
+ return Ok(());
+
+}
+
+#[test]
+fn si_base_with_prefixes() -> Result<()> {
+ let expr = r#""#;
+ test("pl", "SimpleSpeak", expr,
+ "1 kwetta-amper, przecinek; 2 ronna-ampers, przecinek; 1 jotta-kandela, przecinek; 2 zetta-kandelas; przecinek; 1 eksa-kelwin, przecinek; 2 peta-kelwins, przecinek; 1 tera-kelwin, przecinek; 2 giga-kelwins, przecinek; 1 mega-gram, przecinek; 2 kilo-grams, przecinek; 1 hekto-metr, przecinek; 2 deka-metrs, przecinek; 1 decy-mol, przecinek; 2 centy-mols, przecinek; 1 mili-sekunda, przecinek; 2 mikro-sekundas; przecinek; 1 nano-sekunda, przecinek; 2 piko-sekundas")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn si_derived_1() -> Result<()> {
+ let expr = r#""#;
+ test("pl", "SimpleSpeak", expr,
+ "1 bekerel, przecinek; 2 bekerels, przecinek; 1 kulomb, przecinek; 2 kulombs, przecinek; 1 stopień Celsjusza, przecinek; 2 stopnie Celsjusza, przecinek; 1 stopień Celsjusza, przecinek; 2 stopnie Celsjusza, przecinek; 1 farad, przecinek; 2 farads, przecinek; 1 grej, przecinek; 2 grejs, przecinek; 1 henr, przecinek; 2 henry, przecinek; 1 herce, przecinek; 2 herces, przecinek; 1 dżul, przecinek; 2 dżuls, przecinek; 1 katal, przecinek; 2 katals, przecinek; 1 lumen, przecinek; 2 lumens, przecinek; 1 luks, przecinek; 2 luksy")?;
+ return Ok(());
+
+}
+
+#[test]
+fn si_derived_1_with_prefixes() -> Result<()> {
+ let expr = r#""#;
+ test("pl", "SimpleSpeak", expr,
+ "1 kwetta-bekerel, przecinek; 2 ronna-bekerels; przecinek; 1 jotta-kulomb, przecinek; 2 zetta-kulombs; przecinek; 1 eksa-farad, przecinek; 2 peta-farads, przecinek; 1 tera-grej, przecinek; 2 giga-grejs, przecinek; 1 mega-henr, przecinek; 2 kilo-henry, przecinek; 1 deka-herce, przecinek; 2 decy-herces, przecinek; 1 centy-dżul, przecinek; 2 mili-dżuls, przecinek; 1 mikro-katal, przecinek; 2 nano-katals, przecinek; 1 piko-lumen, przecinek; 2 femto-lumens, przecinek; 1 atto-luks, przecinek; 2 zepto-luksy, przecinek; 1 mili-stopień Celsjusza; przecinek; 2 mikro-stopnie Celsjusza; przecinek; 1 piko-stopień Celsjusza; przecinek; 2 nano-stopnie Celsjusza")?;
+ return Ok(());
+
+}
+
+#[test]
+fn si_derived_2() -> Result<()> {
+ let expr = r#""#;
+ test("pl", "SimpleSpeak", expr,
+ "1 niuton, przecinek; 2 niutons, przecinek, 1 om przecinek; 2 oms, przecinek, 1 om przecinek; 2 oms, przecinek; 1 paskal, przecinek; 2 paskals, przecinek; 1 siemens, przecinek; 2 siemens, przecinek; 1 siwert, przecinek; 2 siwerts, przecinek; 1 tesla, przecinek; 2 teslas, przecinek; 1 wolt, przecinek; 2 wolty, przecinek, 1 wat, przecinek; 2 waty, przecinek; 1 weber, przecinek; 2 webers")?;
+ return Ok(());
+
+}
+
+#[test]
+fn si_derived_2_with_prefixes() -> Result<()> {
+ let expr = r#""#;
+ test("pl", "SimpleSpeak", expr,
+ "1 kwekto-niuton, przecinek; 2 ronto-niutons; przecinek; 1 jokto-om, przecinek; 2 zepto-oms, przecinek; 1 atto-om, przecinek; 2 femto-oms, przecinek; 1 piko-paskal, przecinek; 2 nano-paskals, przecinek; 1 mikro-siemens, przecinek; 2 mili-siemens, przecinek; 1 centy-siwert, przecinek; 2 decy-siwerts, przecinek; 1 deka-tesla, przecinek; 2 hekto-teslas, przecinek; 1 kilo-wolt, przecinek; 2 mega-wolty, przecinek; 1 giga-wat, przecinek; 2 tera-waty, przecinek; 1 peta-weber, przecinek; 2 eksa-webers")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn si_accepted() -> Result<()> {
+ let expr = r#""#;
+ test("pl", "SimpleSpeak", expr,
+ "1 litr, przecinek; 2 litrs, przecinek; 1 litr, przecinek; 2 litrs, przecinek; 1 litr, przecinek; 2 litrs, przecinek; 1 tona, przecinek; 2 tonas, przecinek; 1 dalton, przecinek; 2 daltons, przecinek; 1 neper, przecinek; 2 nepers, przecinek; 1 jednostka masy atomowej, przecinek; 2 jednostka masy atomowejs; przecinek; 1 elektronowolt, przecinek; 2 elektronowolts, przecinek; 1 radian, przecinek; 2 radians, przecinek; 1 steradian, przecinek; 2 steradians, przecinek, 1 rok, przecinek; 2 roks, przecinek; 1 sekunda łuku, przecinek; 2 sekunda łukus, przecinek, 1 bit, przecinek; 2 bits, przecinek; 1 bajt, przecinek; 2 bajts, przecinek, 1 bod, przecinek; 2 bods")?;
+ return Ok(());
+
+}
+
+#[test]
+fn si_accepted_with_prefixes() -> Result<()> {
+ let expr = r#""#;
+ test("pl", "SimpleSpeak", expr,
+ "1 kwetta-litr, przecinek; 2 ronna-litrs, przecinek; 1 jotta-litr, przecinek; 2 zetta-litrs, przecinek; 1 eksa-litr, przecinek; 2 peta-litrs, przecinek; 1 tera-tona, przecinek; 2 giga-tonas, przecinek; 1 mega-dalton, przecinek; 2 kilo-daltons, przecinek; 1 decy-neper, przecinek; 2 centy-nepers, przecinek; 1, hekto-jednostka masy atomowej; przecinek; 2, deka-jednostka masy atomowejs; przecinek; 1 mili-elektronowolt; przecinek; 2 mikro-elektronowolts; przecinek; 1 nano-radian, przecinek; 2 piko-radians, przecinek; 1 femto-steradian, przecinek; 2 atto-steradians; przecinek; 1 giga-rok, przecinek; 2 mega-roks, przecinek; 1 zepto-sekunda łuku; przecinek; 2 jokto-sekunda łukus; przecinek; 1 kilo-bit, przecinek; 2 mega-bits, przecinek; 1 giga-bajt, przecinek; 2 tera-bajts, przecinek; 1 tera-bod, przecinek; 2 eksa-bods")?;
+ return Ok(());
+
+}
+
+#[test]
+fn without_prefix_time() -> Result<()> {
+ let expr = r#""#;
+ test("pl", "SimpleSpeak", expr,
+ "1 sekunda, przecinek; 2 sekundas, przecinek; 1 sekunda, przecinek; 2 sekundas, przecinek; 1 minuta, przecinek; 2 minutas, przecinek; 1 minuta, przecinek; 2 minutas, przecinek; 1 minuta, przecinek; 2 minutas, przecinek; 1 godzina, przecinek; 2 godzinas, przecinek; 1 godzina, przecinek; 2 godzinas, przecinek; 1 godzina, przecinek; 2 godzinas, przecinek; 1 dzień, przecinek; 2 dzieńs, przecinek; 1 dzień, przecinek; 2 dzieńs, przecinek; 1 tydzień, przecinek; 2 tydzieńs, przecinek; 1 tydzień, przecinek; 2 tydzieńs, przecinek, 1 rok, przecinek; 2 roks, przecinek, 1 rok, przecinek; 2 roks")?;
+ return Ok(());
+
+}
+
+#[test]
+fn without_prefix_angles() -> Result<()> {
+ let expr = r#""#;
+ test("pl", "SimpleSpeak", expr,
+ "1 stopień, przecinek; 2 stopnie, przecinek; 1 stopień, przecinek; 2 stopnie, przecinek; 1 minuta łuku, przecinek; 2 minuta łukus, przecinek; 1 minuta łuku, przecinek; 2 minuta łukus, przecinek; 1 minuta łuku, przecinek; 2 minuta łukus, przecinek; 1 minuta łuku, przecinek; 2 minuta łukus, przecinek; 1 sekunda łuku, przecinek; 2 sekunda łukus, przecinek; 1 sekunda łuku, przecinek; 2 sekunda łukus")?;
+ return Ok(());
+
+}
+
+#[test]
+fn without_prefix_distance() -> Result<()> {
+ let expr = r#""#;
+ test("pl", "SimpleSpeak", expr,
+ "1 jednostka astronomiczna, przecinek; 2 jednostka astronomicznas; przecinek; 1 rok świetlny, przecinek; 2 rok świetlnys, przecinek; 1 parsek, przecinek; 2 parseks, przecinek; 1 angstrem, przecinek; 2 angstrems, przecinek; 1 angstrem, przecinek; 2 angstrems, przecinek; 1 fermi, przecinek; 2 fermis")?;
+ return Ok(());
+
+}
+
+#[test]
+fn without_prefix_other() -> Result<()> {
+ let expr = r#""#;
+ test("pl", "SimpleSpeak", expr,
+ "1 hektar, przecinek; 2 hektars, przecinek; 1 decybel, przecinek; 2 decybels, przecinek; 1 atmosfera, przecinek; 2 atmosferas, przecinek; 1 jednostka masy atomowej, przecinek; 2 jednostka masy atomowejs; przecinek, 1 bar, przecinek; 2 bars, przecinek; 1 kaloria, przecinek; 2 kalorias, przecinek; 1 kiur, przecinek; 2 kiurs, przecinek; 1 grad, przecinek; 2 grads, przecinek; 1 molowy, przecinek; 2 molowys, przecinek; 1 rentgen, przecinek; 2 rentgens, przecinek; 1 obrót na minutę, przecinek; 2 obroty na minutę, przecinek; 1 drachma płynu, przecinek; 2 drachma płynus, przecinek; 1 M h o, przecinek; 2 M h os, przecinek; 1 dyna, przecinek; 2 dynas, przecinek, 1 erg, przecinek; 2 ergs")?;
+ return Ok(());
+
+}
+
+#[test]
+fn without_prefix_powers_of_2() -> Result<()> {
+ let expr = r#""#;
+ test("pl", "SimpleSpeak", expr,
+ "1 kibibit, przecinek; 2 kibibits, przecinek; 1 mebibit, przecinek; 2 mebibits, przecinek; 1 gibibit, przecinek; 2 gibibits, przecinek; 1 tebibit, przecinek; 2 tebibits, przecinek; 1 pebibit, przecinek; 2 pebibits, przecinek; 1 eksbibit, przecinek; 2 eksbibits, przecinek; 1 zebibit, przecinek; 2 zebibits, przecinek; 1 jobibit, przecinek; 2 jobibits, przecinek; 1 kibibajt, przecinek; 2 kibibajts, przecinek; 1 mebibajt, przecinek; 2 mebibajts, przecinek; 1 gibibajt, przecinek; 2 gibibajts, przecinek; 1 tebibajt, przecinek; 2 tebibajts, przecinek; 1 pebibajt, przecinek; 2 pebibajts, przecinek; 1 eksbibajt, przecinek; 2 eksbibajts, przecinek; 1 zebibajt, przecinek; 2 zebibajts, przecinek; 1 jobibajt, przecinek; 2 jobibajts")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn si_other_numbers() -> Result<()> {
+ let expr = r#""#;
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Terse")], expr,
+ "10 l przecinek, 20 m przecinek; x mili-sekundas; przecinek; y mikro-sekundas; przecinek; deka-grams, przecinek; 1235 deka-niutons; przecinek; 25 mikro-sekundas; przecinek; 3234 mols")?;
+ test_prefs("pl", "ClearSpeak", vec![("Verbosity", "Medium")], expr,
+ "10 litr, przecinek; 20 metrs, przecinek; x mili-sekundas; przecinek; y mikro-sekundas; przecinek; deka-grams, przecinek; 1235 deka-niutons; przecinek; 25 mikro-sekundas; przecinek; 3234 mols")?;
+ test_prefs("pl", "SimpleSpeak", vec![("Verbosity", "Verbose")], expr,
+ "10 litr, przecinek; 20 metrs, przecinek; x mili-sekundas; przecinek; y mikro-sekundas; przecinek; deka-grams, przecinek; 1235 deka-niutons; przecinek; 25 mikro-sekundas; przecinek; 3234 mols")?;
+ return Ok(());
+
+}
+
+
+#[test]
+fn test_mtext_inference() -> Result<()> {
+ let expr = r#""#;
+ test("pl", "SimpleSpeak", expr,
+ "nawias kwadratowy otwierający; 1 tona, przecinek; 2 peta-ampers, przecinek; 3 paskals, przecinek; 45 mili-teslas; nawias kwadratowy zamykający")?;
+ return Ok(());
+
+}
+
+ #[test]
+ fn infer_unit() -> Result<()> {
+ let expr = r#""#;
+ test("pl", "SimpleSpeak", expr,
+ "3 metrs, przecinek; 1 kilo-metr, przecinek; 3 metrs, przecinek; 3 dziesiąte farads, przecinek; m indeks dolny minimum koniec indeksu dolnego")?;
+ return Ok(());
+
+ }