File: core_language/pattern/named_tuple_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

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 Pattern
  15 
  16  class NamedTupleTest < Minitest::Test
  17  =begin
  18  <named-tuple-pattern> ::=
  19      "("
  20          <field-pattern> { <field-pattern> }
  21      ")"
  22      ;
  23 
  24  <field-pattern> ::= LABEL [ <variable-pattern> ] ;
  25 
  26  /* <variable-pattern> ::= ... ;  See Variable */
  27  =end
  28      def setup
  29          @interp = Api.setup_interpreter
  30      end
  31 
  32 
  33      def test_value
  34          interp = Api.eval_decls @interp, <<-EOS
  35              val (name:n price:p) = (name:@Apple price:300)
  36              EOS
  37 
  38          value = Api.eval_expr interp, "n"
  39          assert_instance_of VCA::Symbol, value
  40          assert_equal       :Apple,      value.val
  41 
  42          value = Api.eval_expr interp, "p"
  43          assert_instance_of VCAN::Int, value
  44          assert_equal       300,       value.val
  45      end
  46 
  47 
  48      def test_value_swap
  49          interp = Api.eval_decls @interp, <<-EOS
  50              val (price:p name:n) = (name:@Apple price:300)
  51              EOS
  52 
  53          value = Api.eval_expr interp, "p"
  54          assert_instance_of VCAN::Int, value
  55          assert_equal       300,       value.val
  56 
  57          value = Api.eval_expr interp, "n"
  58          assert_instance_of VCA::Symbol, value
  59          assert_equal       :Apple,      value.val
  60      end
  61 
  62 
  63      def test_value_less_than_rhs
  64          interp = Api.eval_decls @interp, <<-EOS
  65              val (name:n) = (name:@Apple price:300)
  66              EOS
  67 
  68          value = Api.eval_expr interp, "n"
  69          assert_instance_of VCA::Symbol, value
  70          assert_equal       :Apple,      value.val
  71      end
  72 
  73 
  74      def test_value_more_than_rhs
  75          assert_raises(X::SelectionError) do
  76              Api.eval_decls @interp, <<-EOS
  77                  val (name:n price:p area:a) = (name:@Apple price:300)
  78                  EOS
  79          end
  80      end
  81 
  82 
  83      def test_value_triple
  84          interp = Api.eval_decls @interp, <<-EOS
  85              val (name:n price:p area:a) =
  86                      (name:@Apple price:300 area:"Aomori")
  87              EOS
  88 
  89          value = Api.eval_expr interp, "n"
  90          assert_instance_of VCA::Symbol, value
  91          assert_equal       :Apple,      value.val
  92 
  93          value = Api.eval_expr interp, "p"
  94          assert_instance_of VCAN::Int, value
  95          assert_equal       300,       value.val
  96 
  97          value = Api.eval_expr interp, "a"
  98          assert_instance_of VCA::String, value
  99          assert_equal       "Aomori",    value.val
 100      end
 101 
 102 
 103      def test_value_none_variable
 104          interp = Api.eval_decls @interp, <<-EOS
 105              val (name: price:) = (name:@Apple price:300)
 106              EOS
 107 
 108          value = Api.eval_expr interp, "name"
 109          assert_instance_of VCA::Symbol, value
 110          assert_equal       :Apple,      value.val
 111 
 112          value = Api.eval_expr interp, "price"
 113          assert_instance_of VCAN::Int, value
 114          assert_equal       300,       value.val
 115      end
 116 
 117 
 118      def test_value_type
 119          interp = Api.eval_decls @interp, <<-EOS
 120              val (name:n : Symbol price:p : Int) =
 121                      (name:@Apple price:300)
 122              EOS
 123 
 124          value = Api.eval_expr interp, "n"
 125          assert_instance_of VCA::Symbol, value
 126          assert_equal       :Apple,      value.val
 127 
 128          value = Api.eval_expr interp, "p"
 129          assert_instance_of VCAN::Int, value
 130          assert_equal       300,       value.val
 131      end
 132 
 133 
 134      def test_should_be_kind_of_specified_type_in_declaration
 135          assert_raises(X::TypeError) do
 136                  Api.eval_decls @interp, <<-EOS
 137                      val (name:n : Unit price:p : Int) =
 138                               (name:@Apple price:300)
 139                  EOS
 140          end
 141      end
 142 
 143 
 144      def test_lambda
 145          value = Api.eval_expr @interp, <<-EOS
 146              { (x:x y:y) -> x + y } (x:3 y:4)
 147              EOS
 148          assert_instance_of VCAN::Int, value
 149          assert_equal       7,         value.val
 150      end
 151 
 152 
 153      def test_lambda_swap
 154          value = Api.eval_expr @interp, <<-EOS
 155              { (y:y x:x) -> x + y } (x:3 y:4)
 156              EOS
 157          assert_instance_of VCAN::Int, value
 158          assert_equal       7,         value.val
 159      end
 160 
 161 
 162      def test_lambda_less_than_param
 163          value = Api.eval_expr @interp, <<-EOS
 164              { (x:x) -> x + 5 } (x:3 y:4)
 165              EOS
 166          assert_instance_of VCAN::Int, value
 167          assert_equal       8,         value.val
 168      end
 169 
 170 
 171      def test_lambda_more_than_param
 172          assert_raises(X::SelectionError) do
 173              Api.eval_expr @interp, <<-EOS
 174                  { (x:x y:y z:z) -> x + y + z } (x:3 y:4)
 175                  EOS
 176          end
 177      end
 178 
 179 
 180      def test_lambda_triple
 181          value = Api.eval_expr @interp, <<-EOS
 182              { (x:x y:y z:z) -> x + y + z } (x:3 y:4 z:5)
 183              EOS
 184          assert_instance_of VCAN::Int, value
 185          assert_equal       12,        value.val
 186      end
 187 
 188 
 189      def test_lambda_none_variable
 190          value = Api.eval_expr @interp, <<-EOS
 191              { (x: y:) -> x + y } (x:3 y:4)
 192              EOS
 193          assert_instance_of VCAN::Int, value
 194          assert_equal       7,         value.val
 195      end
 196 
 197 
 198      def test_lambda_type
 199          value = Api.eval_expr @interp, <<-EOS
 200              { (x:x : Int y:y : Int) -> x + y } (x:3 y:4)
 201              EOS
 202          assert_instance_of VCAN::Int, value
 203          assert_equal       7,         value.val
 204      end
 205 
 206 
 207      def test_should_be_kind_of_specified_type_in_lambda
 208          assert_raises(X::TypeError) do
 209              Api.eval_expr @interp, <<-EOS
 210                  { (x:x : String y:y : Int) -> x + y } (x:3 y:4)
 211                  EOS
 212          end
 213      end
 214  end
 215 
 216  end # Umu::Test::Grammar::CoreLanguage::Pattern
 217 
 218  end # Umu::Test::Grammar::CoreLanguage
 219 
 220  end # Umu::Test::Grammar
 221 
 222  end # Umu::Test
 223 
 224  end # Umu