Browse Source

Index execution tests

master
Dylan Baker 5 years ago
parent
commit
a33e74c894
1 changed files with 88 additions and 0 deletions
  1. 88
    0
      spec/ast/index_spec.rb

+ 88
- 0
spec/ast/index_spec.rb View File

@@ -0,0 +1,88 @@
1
+RSpec.describe AST::Index do
2
+  it 'evaluates array index' do
3
+    expect(
4
+      AST::Index.new(
5
+        AST::Array.new([
6
+          AST::Number.new(1.0),
7
+          AST::Number.new(2.0),
8
+          AST::Number.new(3.0),
9
+        ]),
10
+        AST::Number.new(2.0)
11
+      ).execute(Environment.new)
12
+    ).to eq(3.0)
13
+  end
14
+
15
+  it 'evaluates hash index' do
16
+    expect(
17
+      AST::Index.new(
18
+        AST::Hash.new(
19
+          :a => AST::Number.new(1.0),
20
+          :b => AST::Number.new(2.0),
21
+          :c => AST::Number.new(3.0),
22
+        ),
23
+        AST::Atom.new(:b)
24
+      ).execute(Environment.new)
25
+    ).to eq(2.0)
26
+  end
27
+
28
+  it 'raises for out of bounds array index' do
29
+    expect {
30
+      AST::Index.new(
31
+        AST::Array.new([
32
+          AST::Number.new(1.0),
33
+          AST::Number.new(2.0),
34
+          AST::Number.new(3.0),
35
+        ]),
36
+        AST::Number.new(3.0)
37
+      ).execute(Environment.new)
38
+    }.to raise_error("Array index out of bounds")
39
+  end
40
+
41
+  it 'raises for non-integral key on array' do
42
+    expect {
43
+      AST::Index.new(
44
+        AST::Array.new([
45
+          AST::Number.new(1.0),
46
+          AST::Number.new(2.0),
47
+          AST::Number.new(3.0),
48
+        ]),
49
+        AST::Number.new(1.5)
50
+      ).execute(Environment.new)
51
+    }.to raise_error("Array index requires integer key")
52
+
53
+    expect {
54
+      AST::Index.new(
55
+        AST::Array.new([
56
+          AST::Number.new(1.0),
57
+          AST::Number.new(2.0),
58
+          AST::Number.new(3.0),
59
+        ]),
60
+        AST::String.new("5")
61
+      ).execute(Environment.new)
62
+    }.to raise_error("Array index requires integer key")
63
+
64
+    expect {
65
+      AST::Index.new(
66
+        AST::Array.new([
67
+          AST::Number.new(1.0),
68
+          AST::Number.new(2.0),
69
+          AST::Number.new(3.0),
70
+        ]),
71
+        AST::Atom.new(:atom)
72
+      ).execute(Environment.new)
73
+    }.to raise_error("Array index requires integer key")
74
+  end
75
+
76
+  it 'raises for missing hash key' do
77
+    expect {
78
+      AST::Index.new(
79
+        AST::Hash.new({
80
+          :a => AST::Number.new(1.0),
81
+          :b => AST::Number.new(2.0),
82
+          :c => AST::Number.new(3.0),
83
+        }),
84
+        AST::Atom.new(:d)
85
+      ).execute(Environment.new)
86
+    }.to raise_error("Key d does not exist on object")
87
+  end
88
+end

Loading…
Cancel
Save