A toy dynamic programming language written in Ruby
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

index_spec.rb 2.2KB

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