File: core_language/expression/entry/case_expression/mono_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: MonoTest#20
inherits from
  Test ( Minitest )
has properties
method: setup #38
method: test_list #45
method: test_cell_stream #75
method: test_memo_stream #121

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 MonoTest < Minitest::Test
  21  =begin
  22  <case-rule-head-list> ::=
  23      "[" "]"
  24    | "[" <var-pattern> "|" <var-pattern> "]"
  25    ;
  26 
  27  <case-rule-head-cell-stream> ::=
  28      "&[" "]"
  29    | "&[" <var-pattern> "|" <var-pattern> "]"
  30    ;
  31 
  32  <case-rule-head-memo-stream> ::=
  33      "&{" "}"
  34    | "&{" <var-pattern> "|" <var-pattern> "}"
  35    ;
  36  =end
  37 
  38      def setup
  39          @interp = Api.setup_interpreter
  40 
  41          @loc = LOC.make_location __FILE__, __LINE__
  42      end
  43 
  44 
  45      def test_list
  46          script = <<-EOS
  47              case xs of {
  48                | []      -> Datum @N ()
  49                | [x|xs'] -> Datum @C (x, xs')
  50              }
  51              EOS
  52 
  53          value = Api.eval_expr(
  54                          @interp, script, xs:VC.make_nil
  55                      )
  56          assert_instance_of VCU::Datum, value
  57          assert_equal       :N,         value.tag_sym
  58 
  59          value = Api.eval_expr(
  60                          @interp,
  61                          script,
  62                          xs:VC.make_cons(VC.make_integer(3), VC.make_nil)
  63                      )
  64          assert_instance_of VCU::Datum, value
  65          assert_equal       :C,         value.tag_sym
  66          assert_instance_of VCP::Tuple, value.contents
  67 
  68          head_value, tail_value = value.contents.values
  69          assert_instance_of VCAN::Int,      head_value
  70          assert_equal       3,              head_value.val
  71          assert_instance_of VCM::List::Nil, tail_value
  72      end
  73 
  74 
  75      def test_cell_stream
  76          script = <<-EOS
  77              val ys = case xs of {
  78                         | &[]      -> Datum @N ()
  79                         | &[x|xs'] -> Datum @C (x, xs')
  80                       }
  81              EOS
  82 
  83          interp_1 = Api.eval_decls(
  84                          @interp,
  85                          script,
  86                          xs:VC.make_cell_stream_nil(
  87                              Api.va_context(@interp)
  88                          )
  89                      )
  90          value_1 = Api.eval_expr interp_1, "ys"
  91          assert_instance_of VCU::Datum, value_1
  92          assert_equal       :N,         value_1.tag_sym
  93 
  94          interp_2 = Api.eval_decls(
  95                          @interp,
  96                          script,
  97                          xs:VC.make_cell_stream_cons(
  98                              ASCE.make_integer(@loc, 3),
  99                              VC.make_cell_stream_nil(
 100                                  Api.va_context(@interp)
 101                              ),
 102                              Api.va_context(@interp)
 103                          )
 104                      )
 105          value_2 = Api.eval_expr interp_2, "ys"
 106          assert_instance_of VCU::Datum, value_2
 107          assert_equal       :C,         value_2.tag_sym
 108          assert_instance_of VCP::Tuple, value_2.contents
 109 
 110          interp_3 = Api.eval_decls interp_2, "val (hd, tl) = ys.contents"
 111          head_value = Api.eval_expr interp_3, "hd"
 112          tail_value = Api.eval_expr interp_3, "tl"
 113 
 114          assert_instance_of VCAN::Int,                head_value
 115          assert_equal       3,                        head_value.val
 116          assert_instance_of VCM::Stream::Entry::Cell, tail_value
 117          assert_instance_of VCM::Stream::Cell::Nil,   tail_value.cell
 118      end
 119 
 120 
 121      def test_memo_stream
 122          script = <<-EOS
 123              val ys = case xs of {
 124                         | &{}      -> Datum @N ()
 125                         | &{x|xs'} -> Datum @C (x, xs')
 126                       }
 127              EOS
 128 
 129          interp_1 = Api.eval_decls(
 130                          @interp,
 131                          script,
 132                          xs:VC.make_memo_stream_nil(
 133                              Api.va_context(@interp)
 134                          )
 135                      )
 136          value_1 = Api.eval_expr interp_1, "ys"
 137          assert_instance_of VCU::Datum, value_1
 138          assert_equal       :N,         value_1.tag_sym
 139 
 140          interp_2 = Api.eval_decls(
 141                          @interp,
 142 
 143                          script,
 144 
 145                          xs:VC.make_memo_stream_entry(
 146                              ASCE.make_memo_stream_cons(
 147                                  @loc,
 148                                  ASCE.make_integer(@loc, 3),
 149                                  ASCE.make_memo_stream_nil(@loc)
 150                              ),
 151 
 152                              Api.va_context(@interp)
 153                          )
 154                      )
 155          value_2 = Api.eval_expr interp_2, "ys"
 156          assert_instance_of VCU::Datum, value_2
 157          assert_equal       :C,         value_2.tag_sym
 158          assert_instance_of VCP::Tuple, value_2.contents
 159 
 160          interp_3 = Api.eval_decls interp_2, "val (hd, tl) = ys.contents"
 161          head_value = Api.eval_expr interp_3, "hd"
 162          tail_value = Api.eval_expr interp_3, "tl"
 163 
 164          assert_instance_of VCAN::Int,                        head_value
 165          assert_equal       3,                                head_value.val
 166          assert_instance_of VCM::Stream::Entry::Memorization, tail_value
 167 
 168          forced_value_2 = Api.eval_expr interp_3, "tl.force"
 169          assert_instance_of VCU::Option::None, forced_value_2
 170      end
 171  end
 172 
 173  end # Umu::Test::Grammar::CoreLanguage::Expression::Entry::CaseExpression
 174 
 175  end # Umu::Test::Grammar::CoreLanguage::Expression::Entry
 176 
 177  end # Umu::Test::Grammar::CoreLanguage::Expression
 178 
 179  end # Umu::Test::Grammar::CoreLanguage
 180 
 181  end # Umu::Test::Grammar
 182 
 183  end # Umu::Test
 184 
 185  end # Umu