import Quick
import Nimble

@testable import ExpoModulesCore

class JavaScriptRuntimeSpec: QuickSpec {
  override func spec() {
    let runtime = JavaScriptRuntime()

    it("has global object accessible") {
      expect(runtime.global) !== nil
    }

    describe("evaluateScript") {
      it("returns primitive types") {
        expect(runtime.evaluateScript("null")).to(beNil())
        expect(runtime.evaluateScript("undefined")).to(beNil())
        expect(runtime.evaluateScript("true") as? Bool) == true
        expect(runtime.evaluateScript("false") as? Bool) == false
        expect(runtime.evaluateScript("123") as? Int) == 123
        expect(runtime.evaluateScript("1.23") as? Double) == 1.23
        expect(runtime.evaluateScript("'foobar'") as? String) == "foobar"
      }

      it("returns arrays") {
        expect(runtime.evaluateScript("['foo', 'bar']") as? [String]) == ["foo", "bar"]
      }

      it("returns dicts") {
        expect(runtime.evaluateScript("{ 'foo': 123 }") as? [String: Int]) == ["foo": 123]
        expect(runtime.evaluateScript("{ 'foo': 'bar' }") as? [String: String]) == ["foo": "bar"]
      }
    }
  }
}
