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.1KB

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