12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- RSpec.describe AST::Index do
- it 'evaluates array index' do
- expect(
- AST::Index.new(
- AST::Array.new([
- AST::Number.new(1.0),
- AST::Number.new(2.0),
- AST::Number.new(3.0),
- ]),
- AST::Number.new(2.0)
- ).execute(Environment.new)
- ).to eq(3.0)
- end
-
- it 'evaluates hash index' do
- expect(
- AST::Index.new(
- AST::Hash.new(
- :a => AST::Number.new(1.0),
- :b => AST::Number.new(2.0),
- :c => AST::Number.new(3.0),
- ),
- AST::Atom.new(:b)
- ).execute(Environment.new)
- ).to eq(2.0)
- end
-
- it 'raises for out of bounds array index' do
- expect {
- AST::Index.new(
- AST::Array.new([
- AST::Number.new(1.0),
- AST::Number.new(2.0),
- AST::Number.new(3.0),
- ]),
- AST::Number.new(3.0)
- ).execute(Environment.new)
- }.to raise_error("Array index out of bounds")
- end
-
- it 'raises for non-integral key on array' do
- expect {
- AST::Index.new(
- AST::Array.new([
- AST::Number.new(1.0),
- AST::Number.new(2.0),
- AST::Number.new(3.0),
- ]),
- AST::Number.new(1.5)
- ).execute(Environment.new)
- }.to raise_error("Array index requires integer key")
-
- expect {
- AST::Index.new(
- AST::Array.new([
- AST::Number.new(1.0),
- AST::Number.new(2.0),
- AST::Number.new(3.0),
- ]),
- AST::String.new("5")
- ).execute(Environment.new)
- }.to raise_error("Array index requires integer key")
-
- expect {
- AST::Index.new(
- AST::Array.new([
- AST::Number.new(1.0),
- AST::Number.new(2.0),
- AST::Number.new(3.0),
- ]),
- AST::Atom.new(:atom)
- ).execute(Environment.new)
- }.to raise_error("Array index requires integer key")
- end
-
- it 'raises for missing hash key' do
- expect {
- AST::Index.new(
- AST::Hash.new({
- :a => AST::Number.new(1.0),
- :b => AST::Number.new(2.0),
- :c => AST::Number.new(3.0),
- }),
- AST::Atom.new(:d)
- ).execute(Environment.new)
- }.to raise_error("Key d does not exist on object")
- end
- end
|