File: core_language/expression/entry/case_expression/poly_test.rb

Overview
Module Structure
Class Hierarchy
Code

Overview

Module Structure

  module: <Toplevel Module>
  module: Umu#6
  module: Test#8
  module: Grammar#10
  module: CoreLanguage#12
  module: Expression#14
  module: Entry#16
  module: CaseExpression#18
  class: PolyTest#20
inherits from
  Test ( Minitest )
has properties
method: setup #28
method: test_1_nil_cons_else #39
method: test_2_nil_cons_no_else #58
method: test_3_nil_no_cons_else #82
method: test_4_nil_no_cons_no_else #100
method: test_5_no_nil_cons_else #117
method: test_6_no_nil_cons_no_else #141
method: test_7_no_nil_no_cons #154

Code

   1  # frozen_string_literal: true
   2 
   3  require "test_helper"
   4 
   5 
   6  module Umu
   7 
   8  module Test
   9 
  10  module Grammar
  11 
  12  module CoreLanguage
  13 
  14  module Expression
  15 
  16  module Entry
  17 
  18  module CaseExpression
  19 
  20  class PolyTest < Minitest::Test
  21  =begin
  22  <case-rule-head-poly> ::=
  23      "&[" "]"
  24    | "&[" <var-pattern> "|" <var-pattern> "]"
  25    :
  26  =end
  27 
  28      def setup
  29          @interp = Api.setup_interpreter
  30 
  31          @nil_value  = VC.make_nil
  32          @cons_value = VC.make_cons(
  33                                  VC.make_integer(3),
  34                                  VC.make_nil
  35                              )
  36      end
  37 
  38 
  39      def test_1_nil_cons_else
  40          script = <<-EOS
  41              case xs of {
  42                | %[]      -> Datum @N ()
  43                | %[x|xs'] -> Datum @C (x, xs')
  44                  else     -> Datum @E ()
  45              }
  46              EOS
  47 
  48          assert_raises(X::SyntaxError) do
  49              Api.eval_expr @interp, script, xs:@nil_value
  50          end
  51 
  52          assert_raises(X::SyntaxError) do
  53              Api.eval_expr @interp, script, xs:@cons_value
  54          end
  55      end
  56 
  57 
  58      def test_2_nil_cons_no_else
  59          script = <<-EOS
  60              case xs of {
  61                | %[]      -> Datum @N ()
  62                | %[x|xs'] -> Datum @C (x, xs')
  63              }
  64              EOS
  65 
  66          value = Api.eval_expr @interp, script, xs:@nil_value
  67          assert_instance_of VCU::Datum, value
  68          assert_equal       :N,         value.tag_sym
  69 
  70          value = Api.eval_expr @interp, script, xs:@cons_value
  71          assert_instance_of VCU::Datum, value
  72          assert_equal       :C,         value.tag_sym
  73          assert_instance_of VCP::Tuple, value.contents
  74 
  75          head_value, tail_value = value.contents.values
  76          assert_instance_of VCAN::Int,      head_value
  77          assert_equal       3,              head_value.val
  78          assert_instance_of VCM::List::Nil, tail_value
  79      end
  80 
  81 
  82      def test_3_nil_no_cons_else
  83          script = <<-EOS
  84              case xs of {
  85                  %[]  -> Datum @N ()
  86                  else -> Datum @E ()
  87              }
  88              EOS
  89 
  90          value = Api.eval_expr @interp, script, xs:@nil_value
  91          assert_instance_of VCU::Datum, value
  92          assert_equal       :N,         value.tag_sym
  93 
  94          value = Api.eval_expr @interp, script, xs:@cons_value
  95          assert_instance_of VCU::Datum, value
  96          assert_equal       :E,         value.tag_sym
  97      end
  98 
  99 
 100      def test_4_nil_no_cons_no_else
 101          script = <<-EOS
 102              case xs of {
 103                  %[]  -> Datum @N ()
 104              }
 105              EOS
 106 
 107          value = Api.eval_expr @interp, script, xs:@nil_value
 108          assert_instance_of VCU::Datum, value
 109          assert_equal       :N,         value.tag_sym
 110 
 111          assert_raises(X::UnmatchError) do
 112              value = Api.eval_expr @interp, script, xs:@cons_value
 113          end
 114      end
 115 
 116 
 117      def test_5_no_nil_cons_else
 118          script = <<-EOS
 119              case xs of {
 120                | %[x|xs'] -> Datum @C (x, xs')
 121                  else     -> Datum @E ()
 122              }
 123              EOS
 124 
 125          value = Api.eval_expr @interp, script, xs:@nil_value
 126          assert_instance_of VCU::Datum, value
 127          assert_equal       :E,         value.tag_sym
 128 
 129          value = Api.eval_expr @interp, script, xs:@cons_value
 130          assert_instance_of VCU::Datum, value
 131          assert_equal       :C,         value.tag_sym
 132          assert_instance_of VCP::Tuple, value.contents
 133 
 134          head_value, tail_value = value.contents.values
 135          assert_instance_of VCAN::Int,      head_value
 136          assert_equal       3,              head_value.val
 137          assert_instance_of VCM::List::Nil, tail_value
 138      end
 139 
 140 
 141      def test_6_no_nil_cons_no_else
 142          script = <<-EOS
 143              case xs of {
 144                  %[x|xs'] -> Datum @C (x, xs')
 145              }
 146              EOS
 147 
 148          assert_raises(X::UnmatchError) do
 149              Api.eval_expr @interp, script, xs:@nil_value
 150          end
 151      end
 152 
 153 
 154      def test_7_no_nil_no_cons
 155          script = <<-EOS
 156              case xs of {
 157                  else -> Datum @E ()
 158              }
 159              EOS
 160 
 161          assert_raises(X::SyntaxError) do
 162              Api.eval_expr @interp, script, xs:@nil_value
 163          end
 164      end
 165  end
 166 
 167  end # Umu::Test::Grammar::CoreLanguage::Expression::Entry::CaseExpression
 168 
 169  end # Umu::Test::Grammar::CoreLanguage::Expression::Entry
 170 
 171  end # Umu::Test::Grammar::CoreLanguage::Expression
 172 
 173  end # Umu::Test::Grammar::CoreLanguage
 174 
 175  end # Umu::Test::Grammar
 176 
 177  end # Umu::Test
 178 
 179  end # Umu