module Get_type = Qsp_checks.Get_type module T = Qsp_syntax.T let _position = (Lexing.dummy_pos, Lexing.dummy_pos) let type_of : Get_type.Expression.t Alcotest.testable = Alcotest.testable Get_type.Expression.pp Get_type.Expression.equal let ctx = Qsp_syntax.S.{ f = (fun _ -> None) } let add_number () = let actual = Get_type.Expression.boperator ~ctx _position T.Plus (Get_type.Expression.integer ~ctx _position "0") (Get_type.Expression.integer ~ctx _position "1") in let expected = Get_type.Expression.(Raw Integer) in let msg = "Adding integer" in Alcotest.(check' type_of ~msg ~expected ~actual) let add_literal_number () = let actual = Get_type.Expression.boperator ~ctx _position T.Plus (Get_type.Expression.literal ~ctx _position [ T.Text "2" ]) (Get_type.Expression.integer ~ctx _position "1") in let expected = Get_type.Expression.(Raw Integer) in let msg = "A string containing integer is considered as integer" in Alcotest.(check' type_of ~msg ~expected ~actual) let concat_text () = let actual = Get_type.Expression.boperator ~ctx _position T.Plus (Get_type.Expression.literal ~ctx _position [ T.Text "a" ]) (Get_type.Expression.integer ~ctx _position "1") in let expected = Get_type.Expression.(Raw String) in let msg = "Concatenate" in Alcotest.(check' type_of ~msg ~expected ~actual) let literal_1 () = let actual = Get_type.Expression.literal ~ctx _position [ T.Expression (Get_type.Expression.Raw Integer) ] and expected = Get_type.Expression.(Raw NumericString) in let msg = "" in Alcotest.(check' type_of ~msg ~expected ~actual) let literal_2 () = let actual = Get_type.Expression.literal ~ctx _position Get_type.Expression.[ T.Text "1"; T.Expression (Raw Integer) ] and expected = Get_type.Expression.(Raw NumericString) in let msg = "" in Alcotest.(check' type_of ~msg ~expected ~actual) let literal_3 () = let actual = Get_type.Expression.literal ~ctx _position Get_type.Expression.[ T.Text "b"; T.Expression (Raw Integer) ] and expected = Get_type.Expression.(Raw String) in let msg = "" in Alcotest.(check' type_of ~msg ~expected ~actual) let literal_4 () = let actual = Get_type.Expression.literal ~ctx _position Get_type.Expression.[ T.Expression (Variable Integer) ] and expected = Get_type.Expression.(Variable NumericString) in let msg = "" in Alcotest.(check' type_of ~msg ~expected ~actual) let min () = let actual = Get_type.Expression.function_ ~ctx _position T.Min [] in let expected = Get_type.Expression.(Raw Bool) in let msg = "The function min without argument return a default value" in Alcotest.(check' type_of ~msg ~expected ~actual); let actual = Get_type.Expression.function_ ~ctx _position T.Min [ Get_type.Expression.literal ~ctx _position [] ] in let expected = Get_type.Expression.(Variable NumericString) in let msg = "The function min with a literal will take the literal as the name of an \ array" in Alcotest.(check' type_of ~msg ~expected ~actual); let actual = Get_type.Expression.function_ ~ctx _position T.Min Get_type.Expression. [ integer ~ctx _position ""; integer ~ctx _position "" ] in let expected = Get_type.Expression.(Raw Integer) in let msg = "With two or more arguments, return the type of the first one" in Alcotest.(check' type_of ~msg ~expected ~actual) let test = ( "Type expression", [ Alcotest.test_case "int + int" `Quick add_number; Alcotest.test_case "'int' + int" `Quick add_literal_number; Alcotest.test_case "str + int" `Quick concat_text; Alcotest.test_case "<>" `Quick literal_1; Alcotest.test_case "1<>" `Quick literal_2; Alcotest.test_case "b<>" `Quick literal_3; Alcotest.test_case "<<$int>>" `Quick literal_4; Alcotest.test_case "min" `Quick min; ] )