# frozen_string_literal: true require "minitest/autorun" require "dhall" class TestReadme < Minitest::Test # Load, as_dhall, and resolver tests are in their own files FUNCTION = Dhall.load("\\(x: Natural) -> x + 1").sync CURRIED_FUNCTION = Dhall.load( "\\(x: Natural) -> \\(y: Natural) -> x + y" ).sync BOOL = Dhall.load("True").sync NAT = Dhall.load("1").sync INT = Dhall.load("+1").sync DOUBLE = Dhall.load("1.0").sync TEXT = Dhall.load("\"abc\"").sync SOME = Dhall.load("Some 1").sync NONE = Dhall.load("None Natural").sync LIST = Dhall.load("[1,2]").sync REC = Dhall.load("{ a = 1 }").sync ENUM = Dhall.load("< one | two >.one").sync UNION = Dhall.load("< Natural: Natural | Text: Text >.Natural 1").sync def test_function_send_call assert_equal Dhall::Natural.new(value: 2), FUNCTION.call(1) end def test_function_send_staples assert_equal Dhall::Natural.new(value: 2), FUNCTION[1] end def test_function_use_as_proc assert_equal( [Dhall::Natural.new(value: 2), Dhall::Natural.new(value: 3)], [1, 2].map(&FUNCTION) ) end def test_function_send_to_proc assert_kind_of Proc, FUNCTION.to_proc assert_equal Dhall::Natural.new(value: 2), FUNCTION.to_proc.call(1) end def test_curried_function_call_curried assert_equal( Dhall::Natural.new(value: 2), CURRIED_FUNCTION.call(1).call(1) ) end def test_curried_function_call_uncurried assert_equal( Dhall::Natural.new(value: 2), CURRIED_FUNCTION.call(1, 1) ) end def test_bool_and_false assert_equal false, BOOL & false end def test_bool_or_false assert_equal Dhall::Bool.new(value: true), BOOL | false end def test_not_bool assert_equal Dhall::Bool.new(value: false), !BOOL end def test_bool_match_true assert_equal true, BOOL === true end def test_bool_reduce_true_false assert_equal true, BOOL.reduce(true, false) end def test_bool_to_s assert_equal "True", BOOL.to_s end def test_nat_plus_1 assert_equal Dhall::Natural.new(value: 2), NAT + 1 end def test_1_plus_nat assert_equal Dhall::Natural.new(value: 2), 1 + NAT end def test_nat_times_2 assert_equal Dhall::Natural.new(value: 2), NAT * 2 end def test_2_times_nat assert_equal Dhall::Natural.new(value: 2), 2 * NAT end def test_nat_match_1 assert_equal true, NAT === 1 end def test_nat_zero assert_equal false, NAT.zero? end def test_nat_even assert_equal false, NAT.even? end def test_nat_odd assert_equal true, NAT.odd? end def test_nat_pred assert_equal Dhall::Natural.new(value: 0), NAT.pred end def test_nat_to_s assert_equal "1", NAT.to_s end def test_nat_to_i assert_equal 1, NAT.to_i end def test_int_match_1 assert_equal true, INT === 1 end def test_int_to_s assert_equal "+1", INT.to_s end def test_int_to_i assert_equal 1, INT.to_i end def test_double_match_one assert_equal true, DOUBLE === 1.0 end def test_double_to_s assert_equal "1.0", DOUBLE.to_s end def test_double_to_f assert_equal 1.0, DOUBLE.to_f end def test_text_match_abc assert_equal true, TEXT === "abc" end def test_text_to_s assert_equal "abc", TEXT.to_s end def test_some_map assert_equal( Dhall::Optional.new( value: Dhall::Natural.new(value: 2), value_type: nil ), SOME.map { |x| x + 1 } ) end def test_some_map_with_type assert_equal( Dhall::Optional.new( value: Dhall::Natural.new(value: 2), value_type: Dhall::Builtins[:Natural] ), SOME.map(type: Dhall::Builtins[:Natural]) { |x| x + 1 } ) end def test_some_reduce assert_equal Dhall::Natural.new(value: 1), SOME.reduce(nil) { |x| x } end def test_some_to_s assert_equal "1", SOME.to_s end def test_none_map assert_equal( Dhall::OptionalNone.new(value_type: Dhall::Builtins[:Natural]), NONE.map { |x| x + 1 } ) end def test_none_map_with_type assert_equal( Dhall::OptionalNone.new(value_type: Dhall::Builtins[:Natural]), NONE.map(type: Dhall::Builtins[:Natural]) { |x| x + 1 } ) end def test_none_reduce assert_equal nil, NONE.reduce(nil) { |x| x } end def test_none_to_s assert_equal "", NONE.to_s end def test_list_map assert_equal( Dhall::List.new(elements: [ Dhall::Natural.new(value: 2), Dhall::Natural.new(value: 3) ], element_type: nil), LIST.map { |x| x + 1 } ) end def test_list_map_with_type assert_equal( Dhall::List.new(elements: [ Dhall::Natural.new(value: 2), Dhall::Natural.new(value: 3) ], element_type: Dhall::Builtins[:Natural]), LIST.map(type: Dhall::Builtins[:Natural]) { |x| x + 1 } ) end def test_list_reduce assert_equal( Dhall::Natural.new(value: 1), LIST.reduce(nil) { |x, _| x } ) end def test_list_first assert_equal( Dhall::Optional.new( value: Dhall::Natural.new(value: 1), value_type: Dhall::Builtins[:Natural] ), LIST.first ) end def test_list_last assert_equal( Dhall::Optional.new( value: Dhall::Natural.new(value: 2), value_type: Dhall::Builtins[:Natural] ), LIST.last ) end def test_list_index_0 assert_equal( Dhall::Optional.new( value: Dhall::Natural.new(value: 1), value_type: Dhall::Builtins[:Natural] ), LIST[0] ) end def test_list_index_100 assert_equal( Dhall::OptionalNone.new(value_type: Dhall::Builtins[:Natural]), LIST[100] ) end def test_list_reverse assert_equal( Dhall::List.new(elements: [ Dhall::Natural.new(value: 2), Dhall::Natural.new(value: 1) ], element_type: Dhall::Builtins[:Natural]), LIST.reverse ) end def test_list_join assert_equal "1,2", LIST.join(",") end def test_list_to_a assert_equal( [Dhall::Natural.new(value: 1), Dhall::Natural.new(value: 2)], LIST.to_a ) end def test_rec_index_a_string assert_equal Dhall::Natural.new(value: 1), REC["a"] end def test_rec_index_a_symbol assert_equal Dhall::Natural.new(value: 1), REC[:a] end def test_rec_index_b_string assert_equal nil, REC["b"] end def test_rec_fetch_a_string assert_equal Dhall::Natural.new(value: 1), REC.fetch("a") end def test_rec_fetch_a_symbol assert_equal Dhall::Natural.new(value: 1), REC.fetch(:a) end def test_rec_fetch_b_string assert_raises KeyError do REC.fetch("b") end end def test_rec_dig_a assert_equal Dhall::Natural.new(value: 1), REC.dig(:a) end def test_rec_dig_b assert_equal nil, REC.dig(:b) end def test_rec_slice_a assert_equal( Dhall::Record.new(record: { "a" => Dhall::Natural.new(value: 1) }), REC.slice(:a) ) end def test_rec_slice assert_equal Dhall::EmptyRecord.new, REC.slice end def test_rec_keys assert_equal ["a"], REC.keys end def test_rec_values assert_equal [Dhall::Natural.new(value: 1)], REC.values end def test_rec_map assert_equal( Dhall::Record.new(record: { "a" => Dhall::Natural.new(value: 2) }), REC.map { |k, v| [k, v + 1] } ) end def test_rec_merge assert_equal( Dhall::Record.new( record: { "a" => Dhall::Natural.new(value: 1), "b" => Dhall::Natural.new(value: 2) } ), REC.merge(b: 2) ) end def test_rec_deep_merge assert_equal( Dhall::Record.new( record: { "a" => Dhall::Natural.new(value: 1), "b" => Dhall::Natural.new(value: 2) } ), REC.deep_merge(b: 2) ) end def test_enum_to_s assert_equal "one", ENUM.to_s end def test_enum_reduce assert_equal 1, ENUM.reduce(one: 1, two: 2) end def test_enum_extract assert_equal :one, ENUM.extract end def test_union_to_s assert_equal "1", UNION.to_s end def test_union_reduce assert_equal 1, UNION.reduce(Natural: :to_i, Text: :to_i) end def test_union_extract assert_equal Dhall::Natural.new(value: 1), UNION.extract end def test_coder_dump assert_equal "\x82\x0F\x01".b, Dhall::Coder.dump(1) end def test_coder_load assert_equal 1, Dhall::Coder.load("\x82\x0F\x01".b) end def test_coder_dump_object assert_raises ArgumentError do Dhall::Coder.dump(Object.new) end end def test_coder_roundtrip coder = Dhall::Coder.new(safe: Object) assert_equal Object, coder.load_async(coder.dump(Object.new)).sync.class end end