# frozen_string_literal: true require "minitest/autorun" require "pathname" require "dhall" class TestNormalization < Minitest::Test DIRPATH = Pathname.new(File.dirname(__FILE__)) TESTS = DIRPATH + "../dhall-lang/tests/{α-,}normalization/" Pathname.glob(TESTS + "success/**/*A.dhall").each do |path| test = path.relative_path_from(TESTS).to_s.sub(/A\.dhall$/, "") define_method("test_#{test}") do Dhall::Function.disable_alpha_normalization! if test !~ /α/ assert_equal( Dhall::Parser.parse_file(TESTS + "#{test}B.dhall").value.to_binary, Dhall::Parser.parse_file(path).value.resolve( relative_to: Dhall::Import::Path.from_string(path) ).then(&:normalize).sync.to_binary ) Dhall::Function.enable_alpha_normalization! if test !~ /α/ end end def test_shift_1_x_0_x assert_equal( Dhall::Variable.new(name: "x", index: 1), Dhall::Variable.new(name: "x").shift(1, "x", 0) ) end def test_shift_1_x_1_x assert_equal( Dhall::Variable.new(name: "x", index: 0), Dhall::Variable.new(name: "x").shift(1, "x", 1) ) end def test_shift_1_x_0_y assert_equal( Dhall::Variable.new(name: "y", index: 0), Dhall::Variable.new(name: "y").shift(1, "x", 0) ) end def test_shift_neg1_x_0_x1 assert_equal( Dhall::Variable.new(name: "x", index: 0), Dhall::Variable.new(name: "x", index: 1).shift(-1, "x", 0) ) end def test_shift_closed expr = Dhall::Function.new( var: "x", type: Dhall::Variable.new(name: "Type"), body: Dhall::Variable.new(name: "x", index: 0) ) assert_equal(expr, expr.shift(1, "x", 0)) end def test_shift_free assert_equal( Dhall::Function.new( var: "y", type: Dhall::Variable.new(name: "Type"), body: Dhall::Variable.new(name: "x", index: 1) ), Dhall::Function.new( var: "y", type: Dhall::Variable.new(name: "Type"), body: Dhall::Variable.new(name: "x", index: 0) ).shift(1, "x", 0) ) end def test_substitute_variable assert_equal( Dhall::Natural.new(value: 1), Dhall::Variable.new(name: "x", index: 0).substitute( Dhall::Variable.new(name: "x", index: 0), Dhall::Natural.new(value: 1) ) ) end def test_substitute_variable_different_name assert_equal( Dhall::Variable.new(name: "y", index: 0), Dhall::Variable.new(name: "y", index: 0).substitute( Dhall::Variable.new(name: "x", index: 0), Dhall::Natural.new(value: 1) ) ) end def test_substitute_variable_different_index assert_equal( Dhall::Variable.new(name: "x", index: 1), Dhall::Variable.new(name: "x", index: 1).substitute( Dhall::Variable.new(name: "x", index: 0), Dhall::Natural.new(value: 1) ) ) end end