=============|||
Single module
=============|||

---- MODULE Test ----
====

-------------|||

(source_file
  (module (header_line) (identifier) (header_line) (double_line))
)

=============|||
Module with EXTENDS
=============|||

---- MODULE Test ----
EXTENDS M1, M2, M3
====

-------------|||

(source_file (module (header_line) (identifier) (header_line)
  (extends (identifier_ref) (identifier_ref) (identifier_ref))
(double_line)))

=============|||
Nested Modules
=============|||

---- MODULE Outer ----
---- MODULE Inner ----
---- MODULE Inner2 ----
---- MODULE Inner3 ----
====
====
====
====

-------------|||

(source_file
  (module (header_line) name: (identifier) (header_line)
    (module (header_line) name: (identifier) (header_line)
      (module (header_line) name: (identifier) (header_line)
        (module (header_line) name: (identifier) (header_line) (double_line))
      (double_line))
    (double_line))
  (double_line))
)

=============|||
Sequential Nested modules
=============|||

---- MODULE Test ----
---- MODULE Inner ----
====
---- MODULE Inner2 ----
====
====

-------------|||

(source_file
  (module (header_line) (identifier) (header_line)
    (module (header_line) (identifier) (header_line) (double_line))
    (module (header_line) (identifier) (header_line) (double_line))
  (double_line))
)

=============|||
Definition After Nested Module
=============|||

---- MODULE Test ----
---- MODULE Inner ----
====
op == x
====

-------------|||

(source_file
  (module (header_line) name: (identifier) (header_line)
    (module (header_line) name: (identifier) (header_line) (double_line))
    (operator_definition name: (identifier) (def_eq) definition: (identifier_ref))
  (double_line))
)

=============|||
Named Theorem After Submodule (GH tlaplus/tlaplus #430)
=============|||

---- MODULE Test ----
---- MODULE Inner ----
====
THEOREM T == TRUE
====

--------------|||

(source_file
  (module (header_line) name: (identifier) (header_line)
    (module (header_line) name: (identifier) (header_line) (double_line))
    (theorem name: (identifier) (def_eq) statement: (boolean))
  (double_line))
)

=============|||
Blank File Parse Error
:error
=============|||
-------------|||

=============|||
Missing Module Terminator
:error
=============|||
---- MODULE Test ----
-------------|||

=============|||
Terminating Open Parentheses
:error
=============|||
---- MODULE Test ----
f[x \in Nat] == (
-------------|||

