# file      : unit-tests/cc/parser/module.test
# copyright : Copyright (c) 2014-2017 Code Synthesis Ltd
# license   : MIT; see accompanying LICENSE file

# Test C++ module constructs.
#

: import
:
$* <<EOI >>EOI
import foo;
import foo.bar;
import foo.bar.baz;
EOI

: module-implementation
:
$* <<EOI >>EOI
module foo;
EOI

: module-interface
:
$* <<EOI >>EOI
export module foo;
EOI

: export-imported
:
$* <<EOI >>EOO
export import foo;
EOI
export import foo;
EOO

: export-imported-block
:
$* <<EOI >>EOO
import bar;

export {import foo;}

export
{
  namespace foo
  {
    class c {};
  }

  template <typename T> int f ();

  import bar;
}
EOI
export import bar;
export import foo;
EOO

: non-module
:
$* <<EOI
#pragma import module foo;
#pragma export module foo;
#pragma module foo;
extern module foo: int foo ();
export namespace bar {int fox ();}
EOI

: attribute
:
$* <<EOI >>EOO
import foo [[export({import})]];
module bar [[module({module})]];
EOI
import foo;
module bar;
EOO

: import-duplicate
:
$* <<EOI >>EOO
import foo;
import bar.baz;
import foo;
import bar . baz;
EOI
import foo;
import bar.baz;
EOO

: brace-missing
:
$* <<EOI 2>>EOE != 0
export
{
  class foo
  {
  //};
  module foo;
}
EOI
stdin:8:1: error: {}-imbalance detected
EOE

: brace-stray
:
$* <<EOI 2>>EOE != 0
export
{
  class foo
  {
  };}
}
module foo;
EOI
stdin:6:1: error: {}-imbalance detected
EOE

: import-missing-name
:
$* <<EOI 2>>EOE != 0
import ;
EOI
stdin:1:8: error: module name expected instead of ';'
EOE

: module-missing-name
:
$* <<EOI 2>>EOE != 0
module ;
EOI
stdin:1:8: error: module name expected instead of ';'
EOE

: import-missing-semi
:
$* <<EOI 2>>EOE != 0
import foo
EOI
stdin:2:1: error: ';' expected instead of <end of file>
EOE

: module-missing-semi
:
$* <<EOI 2>>EOE != 0
export module foo
EOI
stdin:2:1: error: ';' expected instead of <end of file>
EOE