content: module Test.Language.Javascript.ModuleParser
      ( testModuleParser
      ) where
  
  import Test.Hspec
  
  import Language.JavaScript.Parser
  
  
  testModuleParser :: Spec
  testModuleParser = describe "Parse modules:" $ do
      it "as" $
          test "as"
              `shouldBe`
              "Right (JSAstModule [JSModuleStatementListItem (JSIdentifier 'as')])"
  
      it "import" $ do
          -- Not yet supported
          -- test "import 'a';"            `shouldBe` ""
  
          test "import def from 'mod';"
              `shouldBe`
              "Right (JSAstModule [JSModuleImportDeclaration (JSImportDeclaration (JSImportClauseDefault (JSIdentifier 'def'),JSFromClause ''mod''))])"
          test "import def from \"mod\";"
              `shouldBe`
              "Right (JSAstModule [JSModuleImportDeclaration (JSImportDeclaration (JSImportClauseDefault (JSIdentifier 'def'),JSFromClause '\"mod\"'))])"
          test "import * as thing from 'mod';"
              `shouldBe`
              "Right (JSAstModule [JSModuleImportDeclaration (JSImportDeclaration (JSImportClauseNameSpace (JSImportNameSpace (JSIdentifier 'thing')),JSFromClause ''mod''))])"
          test "import { foo, bar, baz as quux } from 'mod';"
              `shouldBe`
              "Right (JSAstModule [JSModuleImportDeclaration (JSImportDeclaration (JSImportClauseNameSpace (JSImportsNamed ((JSImportSpecifier (JSIdentifier 'foo'),JSImportSpecifier (JSIdentifier 'bar'),JSImportSpecifierAs (JSIdentifier 'baz',JSIdentifier 'quux')))),JSFromClause ''mod''))])"
          test "import def, * as thing from 'mod';"
              `shouldBe`
              "Right (JSAstModule [JSModuleImportDeclaration (JSImportDeclaration (JSImportClauseDefaultNameSpace (JSIdentifier 'def',JSImportNameSpace (JSIdentifier 'thing')),JSFromClause ''mod''))])"
          test "import def, { foo, bar, baz as quux } from 'mod';"
              `shouldBe`
              "Right (JSAstModule [JSModuleImportDeclaration (JSImportDeclaration (JSImportClauseDefaultNamed (JSIdentifier 'def',JSImportsNamed ((JSImportSpecifier (JSIdentifier 'foo'),JSImportSpecifier (JSIdentifier 'bar'),JSImportSpecifierAs (JSIdentifier 'baz',JSIdentifier 'quux')))),JSFromClause ''mod''))])"
  
      it "export" $ do
          test "export {}"
              `shouldBe`
              "Right (JSAstModule [JSModuleExportDeclaration (JSExportLocals (JSExportClause (())))])"
          test "export {};"
              `shouldBe`
              "Right (JSAstModule [JSModuleExportDeclaration (JSExportLocals (JSExportClause (())))])"
          test "export const a = 1;"
              `shouldBe`
              "Right (JSAstModule [JSModuleExportDeclaration (JSExport (JSConstant (JSVarInitExpression (JSIdentifier 'a') [JSDecimal '1'])))])"
          test "export function f() {};"
              `shouldBe`
              "Right (JSAstModule [JSModuleExportDeclaration (JSExport (JSFunction 'f' () (JSBlock [])))])"
          test "export { a };"
              `shouldBe`
              "Right (JSAstModule [JSModuleExportDeclaration (JSExportLocals (JSExportClause ((JSExportSpecifier (JSIdentifier 'a')))))])"
          test "export { a as b };"
              `shouldBe`
              "Right (JSAstModule [JSModuleExportDeclaration (JSExportLocals (JSExportClause ((JSExportSpecifierAs (JSIdentifier 'a',JSIdentifier 'b')))))])"
          test "export {} from 'mod'"
              `shouldBe`
              "Right (JSAstModule [JSModuleExportDeclaration (JSExportFrom (JSExportClause (()),JSFromClause ''mod''))])"
  
  
  test :: String -> String
  test str = showStrippedMaybe (parseModule str "src")
  