1
1
mirror of https://github.com/github/semantic.git synced 2024-12-20 13:21:59 +03:00
semantic/test/Analysis/Ruby/Spec.hs

82 lines
2.9 KiB
Haskell
Raw Normal View History

2018-03-14 02:19:26 +03:00
module Analysis.Ruby.Spec (spec) where
import Data.Abstract.Environment as Env
import Data.Abstract.Evaluatable
2018-04-19 10:09:30 +03:00
import Data.Abstract.Value as Value
import Data.Abstract.Number as Number
2018-03-28 19:58:12 +03:00
import Control.Monad.Effect (SomeExc(..))
import Data.List.NonEmpty (NonEmpty(..))
2018-03-14 02:19:26 +03:00
import Data.Map
import Data.Map.Monoidal as Map
2018-05-07 23:56:40 +03:00
import Data.Sum
2018-04-21 17:22:09 +03:00
import qualified Language.Ruby.Assignment as Ruby
2018-04-24 02:47:13 +03:00
import qualified Data.Language as Language
2018-03-14 02:19:26 +03:00
import SpecHelpers
spec :: Spec
spec = parallel $ do
describe "Ruby" $ do
it "evaluates require_relative" $ do
2018-05-10 17:58:24 +03:00
((res, state), _) <- evaluate "main.rb"
2018-05-28 15:54:33 +03:00
res `shouldBe` Right [Value.Integer (Number.Integer 1)]
Env.names (environment state) `shouldContain` ["foo"]
2018-03-14 02:19:26 +03:00
2018-03-28 01:18:38 +03:00
it "evaluates load" $ do
2018-05-10 17:58:24 +03:00
env <- environment . snd . fst <$> evaluate "load.rb"
Env.names env `shouldContain` ["foo"]
2018-03-16 01:09:07 +03:00
2018-03-28 01:18:38 +03:00
it "evaluates load with wrapper" $ do
2018-05-10 17:58:24 +03:00
((res, state), _) <- evaluate "load-wrap.rb"
2018-05-17 01:25:02 +03:00
res `shouldBe` Left (SomeExc (inject @(EnvironmentError (Value Precise)) (FreeVariable "foo")))
2018-05-10 17:58:24 +03:00
Env.names (environment state) `shouldContain` [ "Object" ]
2018-03-16 01:09:07 +03:00
2018-03-28 01:18:38 +03:00
it "evaluates subclass" $ do
2018-05-10 17:58:24 +03:00
((res, state), _) <- evaluate "subclass.rb"
2018-05-28 15:54:33 +03:00
res `shouldBe` Right [String "\"<bar>\""]
2018-05-10 17:58:24 +03:00
Env.names (environment state) `shouldContain` [ "Bar", "Foo" ]
2018-05-10 17:58:24 +03:00
(derefQName (heap state) ("Bar" :| []) (environment state) >>= deNamespace) `shouldBe` Just ("Bar", ["baz", "foo", "inspect"])
2018-03-22 19:31:53 +03:00
2018-03-26 22:50:06 +03:00
it "evaluates modules" $ do
2018-05-10 17:58:24 +03:00
((res, state), _) <- evaluate "modules.rb"
2018-05-28 15:54:33 +03:00
res `shouldBe` Right [String "\"<hello>\""]
2018-05-10 17:58:24 +03:00
Env.names (environment state) `shouldContain` [ "Bar" ]
2018-03-26 22:50:06 +03:00
2018-04-23 20:14:52 +03:00
it "handles break correctly" $ do
2018-05-10 17:58:24 +03:00
((res, _), _) <- evaluate "break.rb"
2018-05-28 15:54:33 +03:00
res `shouldBe` Right [Value.Integer (Number.Integer 3)]
2018-04-23 20:14:52 +03:00
it "handles break correctly" $ do
2018-05-10 17:58:24 +03:00
((res, _), _) <- evaluate "next.rb"
2018-05-28 15:54:33 +03:00
res `shouldBe` Right [Value.Integer (Number.Integer 8)]
2018-04-23 20:14:52 +03:00
it "calls functions with arguments" $ do
2018-05-10 17:58:24 +03:00
((res, _), _) <- evaluate "call.rb"
2018-05-28 15:54:33 +03:00
res `shouldBe` Right [Value.Integer (Number.Integer 579)]
2018-04-19 10:09:30 +03:00
it "evaluates early return statements" $ do
2018-05-10 17:58:24 +03:00
((res, _), _) <- evaluate "early-return.rb"
2018-05-28 15:54:33 +03:00
res `shouldBe` Right [Value.Integer (Number.Integer 123)]
2018-04-19 10:09:30 +03:00
2018-03-22 20:02:39 +03:00
it "has prelude" $ do
2018-05-10 17:58:24 +03:00
((res, _), _) <- evaluate "preluded.rb"
2018-05-28 15:54:33 +03:00
res `shouldBe` Right [String "\"<foo>\""]
2018-03-22 19:31:53 +03:00
2018-05-09 22:23:52 +03:00
it "evaluates __LINE__" $ do
2018-05-10 17:58:24 +03:00
((res, _), _) <- evaluate "line.rb"
2018-05-28 15:54:33 +03:00
res `shouldBe` Right [Value.Integer (Number.Integer 4)]
2018-05-09 22:23:52 +03:00
2018-05-10 18:03:42 +03:00
it "resolves builtins used in the prelude" $ do
((res, _), traces) <- evaluate "puts.rb"
2018-05-28 15:54:33 +03:00
res `shouldBe` Right [Unit]
2018-05-10 18:03:42 +03:00
traces `shouldContain` [ "\"hello\"" ]
2018-03-14 02:19:26 +03:00
where
2018-05-28 15:54:33 +03:00
ns n = Just . Latest . Last . Just . Namespace n
2018-03-14 02:19:26 +03:00
addr = Address . Precise
fixtures = "test/fixtures/ruby/analysis/"
evaluate entry = evalRubyProject (fixtures <> entry)
evalRubyProject path = testEvaluating <$> evaluateProject rubyParser Language.Ruby rubyPrelude path