assignment.t
============
use t::GmakeDOM;

plan tests => blocks() * 2;

run_tests;

__DATA__

=== TEST 1: recursively expanded variable setting
--- src

foo = bar

--- dom
MDOM::Document::Gmake
  MDOM::Assignment
    MDOM::Token::Bare         'foo'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Separator            '='
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Bare         'bar'
    MDOM::Token::Whitespace           '\n'



=== TEST 2: recursively expanded variable setting (more complex)
--- src

$(foo) = baz $(hey)

--- dom
MDOM::Document::Gmake
  MDOM::Assignment
    MDOM::Token::Interpolation        '$(foo)'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Separator            '='
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Bare         'baz'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Interpolation        '$(hey)'
    MDOM::Token::Whitespace           '\n'



=== TEST 3: var assignment changed the "rule context" to VOID
--- src
a: b
foo = bar
	# hello!
--- dom
MDOM::Document::Gmake
  MDOM::Rule::Simple
    MDOM::Token::Bare         'a'
    MDOM::Token::Separator            ':'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Bare         'b'
    MDOM::Token::Whitespace           '\n'
  MDOM::Assignment
    MDOM::Token::Bare         'foo'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Separator            '='
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Bare         'bar'
    MDOM::Token::Whitespace           '\n'
  MDOM::Token::Whitespace            '\t'
  MDOM::Token::Comment               '# hello!'
  MDOM::Token::Whitespace            '\n'



=== TEST 4: assignment indented by a tab which is not in the "rule context"
--- src

	foo = bar # this line begins with a tab

--- dom
M::D::G
  MDOM::Assignment
    MDOM::Token::Whitespace     '\t'
    MDOM::Token::Bare         'foo'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Separator            '='
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Bare         'bar'
    MDOM::Token::Whitespace          ' '
    MDOM::Token::Comment             '# this line begins with a tab'
    MDOM::Token::Whitespace           '\n'



=== TEST 5: simply-expanded var assignment
--- src

a := $($($(x)))

--- dom
MDOM::Document::Gmake
  MDOM::Assignment
    MDOM::Token::Bare         'a'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Separator            ':='
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Interpolation                '$($($(x)))'
    MDOM::Token::Whitespace           '\n'



=== TEST 6: multi-line var assignment (recursively-expanded)
--- src

SOURCES = count_words.c \
          lexer.c	\
		counter.c
--- dom
MDOM::Document::Gmake
  MDOM::Assignment
    MDOM::Token::Bare         'SOURCES'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Separator            '='
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Bare         'count_words.c'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Continuation         '\\n'
    MDOM::Token::Whitespace           '          '
    MDOM::Token::Bare         'lexer.c'
    MDOM::Token::Whitespace           '\t'
    MDOM::Token::Continuation         '\\n'
    MDOM::Token::Whitespace           '\t\t'
    MDOM::Token::Bare         'counter.c'
    MDOM::Token::Whitespace           '\n'



=== TEST 7: multi-line var assignment (simply-expanded)
--- src

SOURCES := count_words.c \
          lexer.c	\
		counter.c
--- dom
MDOM::Document::Gmake
  MDOM::Assignment
    MDOM::Token::Bare         'SOURCES'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Separator            ':='
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Bare         'count_words.c'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Continuation         '\\n'
    MDOM::Token::Whitespace           '          '
    MDOM::Token::Bare         'lexer.c'
    MDOM::Token::Whitespace           '\t'
    MDOM::Token::Continuation         '\\n'
    MDOM::Token::Whitespace           '\t\t'
    MDOM::Token::Bare         'counter.c'
    MDOM::Token::Whitespace           '\n'



=== TEST 8: other assignment variations (simply-expanded)
--- src

override foo := 32

--- dom
MDOM::Document::Gmake
  MDOM::Assignment
    MDOM::Token::Bare         'override'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Bare         'foo'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Separator            ':='
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Bare         '32'
    MDOM::Token::Whitespace           '\n'



=== TEST 9: override + assignment (=)
--- src

override foo = 32

--- dom
MDOM::Document::Gmake
  MDOM::Assignment
    MDOM::Token::Bare         'override'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Bare         'foo'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Separator            '='
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Bare         '32'
    MDOM::Token::Whitespace           '\n'



=== TEST 10: override + assignment (:=)
--- src

override foo := 32

--- dom
MDOM::Document::Gmake
  MDOM::Assignment
    MDOM::Token::Bare         'override'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Bare         'foo'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Separator            ':='
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Bare         '32'
    MDOM::Token::Whitespace           '\n'



=== TEST 11: override + assignment (+=)
--- src

override CFLAGS += $(patsubst %,-I%,$(subst :, ,$(VPATH)))

--- dom
MDOM::Document::Gmake
  MDOM::Assignment
    MDOM::Token::Bare                'override'
    MDOM::Token::Whitespace          ' '
    MDOM::Token::Bare                'CFLAGS'
    MDOM::Token::Whitespace          ' '
    MDOM::Token::Separator           '+='
    MDOM::Token::Whitespace          ' '
    MDOM::Token::Interpolation       '$(patsubst %,-I%,$(subst :, ,$(VPATH)))'
    MDOM::Token::Whitespace          '\n'



=== TEST 12: override + assignment (?=)
--- src

override files ?=  main.o kbd.o command.o display.o \
            insert.o search.o files.o utils.o

--- dom
MDOM::Document::Gmake
  MDOM::Assignment
    MDOM::Token::Bare                'override'
    MDOM::Token::Whitespace          ' '
    MDOM::Token::Bare                'files'
    MDOM::Token::Whitespace          ' '
    MDOM::Token::Separator           '?='
    MDOM::Token::Whitespace          '  '
    MDOM::Token::Bare                'main.o'
    MDOM::Token::Whitespace          ' '
    MDOM::Token::Bare                'kbd.o'
    MDOM::Token::Whitespace          ' '
    MDOM::Token::Bare                'command.o'
    MDOM::Token::Whitespace          ' '
    MDOM::Token::Bare                'display.o'
    MDOM::Token::Whitespace          ' '
    MDOM::Token::Continuation                '\\n'
    MDOM::Token::Whitespace          '            '
    MDOM::Token::Bare                'insert.o'
    MDOM::Token::Whitespace          ' '
    MDOM::Token::Bare                'search.o'
    MDOM::Token::Whitespace          ' '
    MDOM::Token::Bare                'files.o'
    MDOM::Token::Whitespace          ' '
    MDOM::Token::Bare                'utils.o'
    MDOM::Token::Whitespace          '\n'








command.t
=========
use t::GmakeDOM;

plan tests => blocks() * 2;

run_tests;

__DATA__

=== TEST 1: blank lines and comment lines as comments
blank lines and lines of just comments may appear among
the command lines; they are ignored.
--- src
foo:
	first

 
# This is ignored
	second

--- dom
M::D::G
  M::R::S
    M::T::B         'foo'
    M::T::S         ':'
    M::T::W         '\n'
  M::C
    M::T::S         '\t'
    M::T::B         'first'
    M::T::W         '\n'
  M::T::W           '\n'
  M::T::W           ' \n'
  M::T::C           '# This is ignored'
  M::T::W           '\n'
  M::C
    M::T::S         '\t'
    M::T::B         'second'
    M::T::W         '\n'



=== TEST 2: empty commands
a blank line that begins with a tab is not blank; it's an empty
command
--- src

foo:
	
	echo

--- dom
M::D::G
  M::R::S
    M::T::B         'foo'
    M::T::S         ':'
    M::T::W         '\n'
  M::C
    M::T::S         '\t'
    M::T::W         '\n'
  M::C
    M::T::S         '\t'
    M::T::B         'echo'
    M::T::W         '\n'



=== TEST 3: comments as commands
a comment in a command line is not a make comment;
it will be passed to the shell as-is.
--- src

foo:
	# This is a command, not a comment

--- dom
M::D::G
  M::R::S
    M::T::B             'foo'
    M::T::S             ':'
    M::T::W             '\n'
  M::C
    M::T::S             '\t'
    M::T::B             '# This is a command, not a comment'
    M::T::W             '\n'



=== TEST 4: var def as commands
a variable definition in a "rule context" which is indented by a tab
as the first character on the line, will be considered a command line.
--- src

foo:
	var = value
	var := value
	var += value
	var ?= value

--- dom
M::D::G
  M::R::S
    M::T::B                 'foo'
    M::T::S                 ':'
    M::T::W                 '\n'
  M::C
    M::T::S                 '\t'
    M::T::B                 'var = value'
    M::T::W                 '\n'
  M::C
    M::T::S                 '\t'
    M::T::B                 'var := value'
    M::T::W                 '\n'
  M::C
    M::T::S                 '\t'
    M::T::B                 'var += value'
    M::T::W                 '\n'
  M::C
    M::T::S                 '\t'
    M::T::B                 'var ?= value'
    M::T::W                 '\n'



=== TEST 5: conditional directives as commands
a conditional expression (ifdef, ifeq, etc) in a "rule context"
which is indented by a tab as the first character on the line,
will be considered a command line
--- src

foo:
	ifdef $(foo)
	echo
	endif

--- dom
M::D::G
  M::R::S
    M::T::B             'foo'
    M::T::S             ':'
    M::T::W             '\n'
  M::C
    M::T::S             '\t'
    M::T::B             'ifdef '
    M::T::I             '$(foo)'
    M::T::W             '\n'
  M::C
    M::T::S             '\t'
    M::T::B             'echo'
    M::T::W             '\n'
  M::C
    M::T::S             '\t'
    M::T::B             'endif'
    M::T::W             '\n'



=== TEST 6: line continuations in commands
--- src
a :
	- mv \#\
	+ e \
  \\
	@

--- dom
MDOM::Document::Gmake
  MDOM::Rule::Simple
    MDOM::Token::Bare           'a'
    MDOM::Token::Whitespace     ' '
    MDOM::Token::Separator      ':'
    MDOM::Token::Whitespace     '\n'
  MDOM::Command
    MDOM::Token::Separator      '\t'
    MDOM::Token::Modifier       '-'
    MDOM::Token::Bare           ' mv \#\\n\t+ e \\n  \\'
    MDOM::Token::Whitespace     '\n'
  MDOM::Command
    MDOM::Token::Separator      '\t'
    MDOM::Token::Modifier       '@'
    MDOM::Token::Whitespace     '\n'



=== TEST 7: line continuations in prereqs and "inline" commands
--- src

a: \
	b;\
    c \
    d

--- dom
MDOM::Document::Gmake
  MDOM::Rule::Simple
    MDOM::Token::Bare           'a'
    MDOM::Token::Separator      ':'
    MDOM::Token::Whitespace     ' '
    MDOM::Token::Continuation   '\\n'
    MDOM::Token::Whitespace     '\t'
    MDOM::Token::Bare           'b'
    MDOM::Command
      MDOM::Token::Separator    ';'
      MDOM::Token::Bare         '\\n    c \\n    d'
      MDOM::Token::Whitespace   '\n'



=== TEST 8: whitespace before command modifiers (@)
--- src

all:
	  @ echo $@

--- dom
MDOM::Document::Gmake
  MDOM::Rule::Simple
    MDOM::Token::Bare         'all'
    MDOM::Token::Separator            ':'
    MDOM::Token::Whitespace           '\n'
  MDOM::Command
    MDOM::Token::Separator            '\t'
    MDOM::Token::Whitespace           '  '
    MDOM::Token::Modifier             '@'
    MDOM::Token::Bare         ' echo '
    MDOM::Token::Interpolation                '$@'
    MDOM::Token::Whitespace           '\n'



=== TEST 9: whitespace before command modifiers (+/-)
--- src

all:
	  + echo $@
		-blah!

--- dom
MDOM::Document::Gmake
  MDOM::Rule::Simple
    MDOM::Token::Bare         'all'
    MDOM::Token::Separator            ':'
    MDOM::Token::Whitespace           '\n'
  MDOM::Command
    MDOM::Token::Separator            '\t'
    MDOM::Token::Whitespace           '  '
    MDOM::Token::Modifier             '+'
    MDOM::Token::Bare         ' echo '
    MDOM::Token::Interpolation                '$@'
    MDOM::Token::Whitespace           '\n'
  MDOM::Command
    MDOM::Token::Separator            '\t'
    MDOM::Token::Whitespace           '\t'
    MDOM::Token::Modifier             '-'
    MDOM::Token::Bare                 'blah!'
    MDOM::Token::Whitespace           '\n'



=== TEST 10: multi-line commands
--- src

compile_all:
	for d in $(source_dirs); \
	do                       \
		$(JAVAC) $$d/*.java; \
	done

--- dom
MDOM::Document::Gmake
  MDOM::Rule::Simple
    MDOM::Token::Bare         'compile_all'
    MDOM::Token::Separator            ':'
    MDOM::Token::Whitespace           '\n'
  MDOM::Command
    MDOM::Token::Separator            '\t'
    MDOM::Token::Bare         'for d in '
    MDOM::Token::Interpolation        '$(source_dirs)'
    MDOM::Token::Bare	'; \\n\tdo                       \\n\t\t'
    MDOM::Token::Interpolation          '$(JAVAC)'
    MDOM::Token::Bare         ' '
    MDOM::Token::Interpolation      '$$'
    MDOM::Token::Bare           'd/*.java; \\n\tdone'
    MDOM::Token::Whitespace		'\n'



=== TEST 11: multi-modifiers
--- src
all:
	@ - exit
        -@ exit 1
        @-exit 1
--- dom
MDOM::Document::Gmake
  MDOM::Rule::Simple
    MDOM::Token::Bare         'all'
    MDOM::Token::Separator            ':'
    MDOM::Token::Whitespace           '\n'
  MDOM::Command
    MDOM::Token::Separator            '\t'
    MDOM::Token::Modifier             '@'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Modifier             '-'
    MDOM::Token::Bare         ' exit'
    MDOM::Token::Whitespace           '\n'
  MDOM::Unknown
    MDOM::Token::Whitespace           '        '
    MDOM::Token::Modifier             '-'
    MDOM::Token::Modifier             '@'
    MDOM::Token::Bare         ' exit 1'
    MDOM::Token::Whitespace           '\n'
  MDOM::Unknown
    MDOM::Token::Whitespace           '        '
    MDOM::Token::Modifier             '@'
    MDOM::Token::Modifier             '-'
    MDOM::Token::Bare         'exit 1'
    MDOM::Token::Whitespace           '\n'



=== TEST 12: line continuations in commands
--- src
all:
	\
	echo $@
--- dom
MDOM::Document::Gmake
  MDOM::Rule::Simple
    MDOM::Token::Bare         'all'
    MDOM::Token::Separator            ':'
    MDOM::Token::Whitespace           '\n'
  MDOM::Command
    MDOM::Token::Separator            '\t'
    MDOM::Token::Bare               '\\n\techo '
    MDOM::Token::Interpolation        '$@'
    MDOM::Token::Whitespace           '\n'



=== TEST 13: ditto (with interpolations)
--- src
all:
	@echo $(FOO) \
   $(BAR) \
	$(BIT)
--- dom
MDOM::Document::Gmake
  MDOM::Rule::Simple
    MDOM::Token::Bare         'all'
    MDOM::Token::Separator            ':'
    MDOM::Token::Whitespace           '\n'
  MDOM::Command
    MDOM::Token::Separator            '\t'
    MDOM::Token::Modifier             '@'
    MDOM::Token::Bare         'echo '
    MDOM::Token::Interpolation                '$(FOO)'
    MDOM::Token::Bare         ' \\n   '
    MDOM::Token::Interpolation  '$(BAR)'
    MDOM::Token::Bare           ' \\n\t'
    MDOM::Token::Interpolation                '$(BIT)'
    MDOM::Token::Whitespace           '\n'





comment.t
=========
use t::GmakeDOM;

plan tests => blocks() * 2;

run_tests;

__DATA__

=== TEST 1: single-line comment
--- src

# This is a comment

--- dom
M::D::G
  M::T::C           '# This is a comment'
  M::T::W           '\n'



=== TEST 2: comment indented by spaces
--- src
   # comment indented by spaces

--- dom
M::D::G
  M::T::W       '   '
  M::T::C       '# comment indented by spaces'
  M::T::W       '\n'



=== TEST 3:
--- src

foo.o : foo.c defs.h   # module for twiddling the frobs
	cc -c -g foo.c

--- dom
M::D::G
  M::R::S
    M::T::B             'foo.o'
    M::T::W             ' '
    M::T::S             ':'
    M::T::W             ' '
    M::T::B             'foo.c'
    M::T::W             ' '
    M::T::B             'defs.h'
    M::T::W             '   '
    M::T::C             '# module for twiddling the frobs'
    M::T::W             '\n'
  M::C
    M::T::S             '\t'
    M::T::B             'cc -c -g foo.c'
    M::T::W             '\n'



=== TEST 4: comments indented by a tab outside the "rule context"
--- src
	# This is a comment rather than a command
--- dom
M::D::G
  M::T::W       '\t'
  M::T::C       '# This is a comment rather than a command'
  M::T::W       '\n'




=== TEST 5: comments indented by a tab within the "rule context"
--- src

foo : bar
	# This is a shell command

--- dom
M::D::G
  M::R::S
    M::T::B         'foo'
    M::T::W         ' '
    M::T::S         ':'
    M::T::W         ' '
    M::T::B         'bar'
    M::T::W         '\n'
  M::C
    M::T::S       '\t'
    M::T::B       '# This is a shell command'
    M::T::W       '\n'



=== TEST 6: line continuations in comments
--- src

a: b # hello! \
	this is comment too! \
 so is this line

	# this is a cmd
	+touch $$

--- dom
MDOM::Document::Gmake
  MDOM::Rule::Simple
    MDOM::Token::Bare           'a'
    MDOM::Token::Separator      ':'
    MDOM::Token::Whitespace     ' '
    MDOM::Token::Bare           'b'
    MDOM::Token::Whitespace     ' '
    MDOM::Token::Comment        '# hello! \\n\tthis is comment too! \\n so is this line'
    MDOM::Token::Whitespace     '\n'
  MDOM::Token::Whitespace       '\n'
  MDOM::Command
    MDOM::Token::Separator      '\t'
    MDOM::Token::Bare           '# this is a cmd'
    MDOM::Token::Whitespace     '\n'
  MDOM::Command
    MDOM::Token::Separator      '\t'
    MDOM::Token::Modifier       '+'
    MDOM::Token::Bare           'touch '
    MDOM::Token::Interpolation  '$$'
    MDOM::Token::Whitespace     '\n'



=== TEST 7: unescaped '#'
--- src
all: foo\\# hello
--- dom
MDOM::Document::Gmake
  MDOM::Rule::Simple
    MDOM::Token::Bare           'all'
    MDOM::Token::Separator      ':'
    MDOM::Token::Whitespace     ' '
    MDOM::Token::Bare           'foo\\'
    MDOM::Token::Comment        '# hello'
    MDOM::Token::Whitespace     '\n'



=== TEST 8: when no space between words and '#'
--- src
bar: foo#hello
--- dom
MDOM::Document::Gmake
  MDOM::Rule::Simple
    MDOM::Token::Bare           'bar'
    MDOM::Token::Separator      ':'
    MDOM::Token::Whitespace     ' '
    MDOM::Token::Bare           'foo'
    MDOM::Token::Comment        '#hello'
    MDOM::Token::Whitespace     '\n'



=== TEST 9: '#' escaped by '\'
--- src

\#a: \#b \#c

--- dom
M::D::G
  M::R::S
    M::T::B             '\#a'
    M::T::S             ':'
    M::T::W             ' '
    M::T::B             '\#b'
    M::T::W             ' '
    M::T::B             '\#c'
    M::T::W             '\n'



=== TEST 10: standalone single-line comment
--- src
# hello
#world!
--- dom
MDOM::Document::Gmake
  MDOM::Token::Comment    '# hello'
  MDOM::Token::Whitespace '\n'
  MDOM::Token::Comment    '#world!'
  MDOM::Token::Whitespace '\n'



=== TEST 11: standalone multi-line comment
--- src
# hello \
	world\
    !
--- dom
MDOM::Document::Gmake
  MDOM::Token::Comment    '# hello \\n\tworld\\n    !'
  MDOM::Token::Whitespace '\n'



=== TEST 12: comments indented by a tab
--- src
	# blah
--- dom
MDOM::Document::Gmake
  MDOM::Token::Whitespace    '\t'
  MDOM::Token::Comment       '# blah'
  MDOM::Token::Whitespace    '\n'



=== TEST 13: multi-line comment indented with tabs
--- src
	# blah \
hello!\
	# hehe
--- dom
MDOM::Document::Gmake
  MDOM::Token::Whitespace    '\t'
  MDOM::Token::Comment       '# blah \\nhello!\\n\t# hehe'
  MDOM::Token::Whitespace    '\n'








directive-define.t
==================
use t::GmakeDOM;

plan tests => blocks() * 2;

run_tests;

__DATA__

=== TEST 1: multi-line var assignment (the 'define' directive)
--- src

define remote-file
  $(if $(filter unix, $($1.type)), \
    /net/$($1.host)/$($1.path), \
    //$($1.host)/$($1.path))
endef

--- dom
MDOM::Document::Gmake
  MDOM::Directive
    MDOM::Token::Bare         'define'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Bare         'remote-file'
    MDOM::Token::Whitespace           '\n'
  MDOM::Unknown
    MDOM::Token::Bare             '  '
    MDOM::Token::Interpolation '$(if $(filter unix, $($1.type)), \\n    /net/$($1.host)/$($1.path), \\n    //$($1.host)/$($1.path))'
    MDOM::Token::Whitespace           '\n'
  MDOM::Directive
    MDOM::Token::Bare         'endef'
    MDOM::Token::Whitespace           '\n'








directive-export.t
==================
use t::GmakeDOM;

plan tests => blocks() * 2;

run_tests;

__DATA__

=== TEST 13: export + assignment (:=)
--- src

export foo := 32

--- dom
MDOM::Document::Gmake
  MDOM::Directive
    MDOM::Token::Bare         'export'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Bare         'foo'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Separator            ':='
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Bare         '32'
    MDOM::Token::Whitespace           '\n'








directive-include.t
===================
use t::GmakeDOM;

plan tests => blocks() * 2;

run_tests;

__DATA__

=== TEST 1: the include directive
--- src
include foo *.mk $(bar)
--- dom
MDOM::Document::Gmake
  MDOM::Directive
    MDOM::Token::Bare         'include'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Bare         'foo'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Bare         '*.mk'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Interpolation                '$(bar)'
    MDOM::Token::Whitespace           '\n'



=== TEST 2: multi-line include directive
--- src
include foo *.mk $(bar) \
    blah blah
--- dom
MDOM::Document::Gmake
  MDOM::Directive
    MDOM::Token::Bare         'include'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Bare         'foo'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Bare         '*.mk'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Interpolation                '$(bar)'
    MDOM::Token::Whitespace          ' '
    MDOM::Token::Continuation                '\\n'
    MDOM::Token::Whitespace          '    '
    MDOM::Token::Bare                'blah'
    MDOM::Token::Whitespace          ' '
    MDOM::Token::Bare                'blah'
    MDOM::Token::Whitespace           '\n'



=== TEST 3: the -include directive
--- src

-include filenames...

--- dom
MDOM::Document::Gmake
  MDOM::Directive
    MDOM::Token::Modifier             '-'
    MDOM::Token::Bare          'include'
    MDOM::Token::Whitespace    ' '
    MDOM::Token::Bare          'filenames...'
    MDOM::Token::Whitespace           '\n'



=== TEST 4: multi-line -include directive
--- src

-include foo bar \
    $@ $^

--- dom
MDOM::Document::Gmake
  MDOM::Directive
    MDOM::Token::Modifier             '-'
    MDOM::Token::Bare          'include'
    MDOM::Token::Whitespace    ' '
    MDOM::Token::Bare          'foo'
    MDOM::Token::Whitespace    ' '
    MDOM::Token::Bare          'bar'
    MDOM::Token::Whitespace    ' '
    MDOM::Token::Continuation                '\\n'
    MDOM::Token::Whitespace    '    '
    MDOM::Token::Interpolation         '$@'
    MDOM::Token::Whitespace    ' '
    MDOM::Token::Interpolation         '$^'
    MDOM::Token::Whitespace           '\n'



=== TEST 5: sinclude directive
sinclude is another name for -include
--- src

sinclude  %.c src

--- dom
M::D::G
  M::D
    M::T::B             'sinclude'
    M::T::W             '  '
    M::T::B             '%.c'
    M::T::W             ' '
    M::T::B             'src'
    M::T::W             '\n'





directive-vpath.t
=================
use t::GmakeDOM;

plan tests => blocks() * 2;

run_tests;

__DATA__

=== TEST 1:
--- src

vpath %.c src:../headers
vpath   %.d
vpath

--- dom
M::D::G
  M::D
    M::T::B       'vpath'
    M::T::W       ' '
    M::T::B       '%.c'
    M::T::W       ' '
    M::T::B       'src'
    M::T::S         ':'
    M::T::B         '../headers'
    M::T::W       '\n'
  M::D
    M::T::B       'vpath'
    M::T::W       '   '
    M::T::B       '%.d'
    M::T::W       '\n'
  M::D
    M::T::B     'vpath'
    M::T::W     '\n'



=== TEST 1: the vpath directive
--- src

vpath %.1 %.c src
  vpath %h include

--- dom
MDOM::Document::Gmake
  MDOM::Directive
    MDOM::Token::Bare         'vpath'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Bare         '%.1'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Bare           '%.c'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Bare         'src'
    MDOM::Token::Whitespace           '\n'
  MDOM::Directive
    MDOM::Token::Whitespace          '  '
    MDOM::Token::Bare                'vpath'
    MDOM::Token::Whitespace          ' '
    MDOM::Token::Bare                '%h'
    MDOM::Token::Whitespace          ' '
    MDOM::Token::Bare                'include'
    MDOM::Token::Whitespace          '\n'



=== TEST 2: multi-line vpath directive
--- src

vpath %.1 %.c src \
    %h include

--- dom
MDOM::Document::Gmake
  MDOM::Directive
    MDOM::Token::Bare         'vpath'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Bare         '%.1'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Bare           '%.c'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Bare         'src'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Continuation                '\\n'
    MDOM::Token::Whitespace          '    '
    MDOM::Token::Bare                '%h'
    MDOM::Token::Whitespace          ' '
    MDOM::Token::Bare                'include'
    MDOM::Token::Whitespace          '\n'








interpolation.t
===============
use t::GmakeDOM;

plan tests => blocks() * 2;

run_tests;

__DATA__

=== TEST 1: variable references in prereq list
--- src

a: foo.c  bar.h	$(baz) # hello!
	@echo ...

--- dom
MDOM::Document::Gmake
  MDOM::Rule::Simple
    MDOM::Token::Bare         'a'
    MDOM::Token::Separator    ':'
    MDOM::Token::Whitespace   ' '
    MDOM::Token::Bare         'foo.c'
    MDOM::Token::Whitespace   '  '
    MDOM::Token::Bare         'bar.h'
    MDOM::Token::Whitespace   '\t'
    MDOM::Token::Interpolation   '$(baz)'
    MDOM::Token::Whitespace      ' '
    MDOM::Token::Comment         '# hello!'
    MDOM::Token::Whitespace      '\n'
  MDOM::Command
    MDOM::Token::Separator    '\t'
    MDOM::Token::Modifier     '@'
    MDOM::Token::Bare         'echo ...'
    MDOM::Token::Whitespace   '\n'



=== TEST 2: variable interpolation cannot be escaped by \
--- src
all: ; echo \$a
--- dom
MDOM::Document::Gmake
  MDOM::Rule::Simple
    MDOM::Token::Bare               'all'
    MDOM::Token::Separator          ':'
    MDOM::Token::Whitespace         ' '
    MDOM::Command
      MDOM::Token::Separator        ';'
      MDOM::Token::Whitespace       ' '
      MDOM::Token::Bare             'echo \'
      MDOM::Token::Interpolation    '$a'
      MDOM::Token::Whitespace       '\n'



=== TEST 3: $@, $a, etc.
--- src
all: $a $(a) ${c}
	echo $@ $a ${a} ${abc} ${}
--- dom
MDOM::Document::Gmake
  MDOM::Rule::Simple
    MDOM::Token::Bare               'all'
    MDOM::Token::Separator          ':'
    MDOM::Token::Whitespace         ' '
    MDOM::Token::Interpolation      '$a'
    MDOM::Token::Whitespace         ' '
    MDOM::Token::Interpolation      '$(a)'
    MDOM::Token::Whitespace         ' '
    MDOM::Token::Interpolation      '${c}'
    MDOM::Token::Whitespace         '\n'
  MDOM::Command
    MDOM::Token::Separator          '\t'
    MDOM::Token::Bare               'echo '
    MDOM::Token::Interpolation      '$@'
    MDOM::Token::Bare               ' '
    MDOM::Token::Interpolation      '$a'
    MDOM::Token::Bare               ' '
    MDOM::Token::Interpolation      '${a}'
    MDOM::Token::Bare               ' '
    MDOM::Token::Interpolation      '${abc}'
    MDOM::Token::Bare               ' '
    MDOM::Token::Interpolation      '${}'
    MDOM::Token::Whitespace         '\n'





misc.t
======
use t::GmakeDOM;

plan tests => blocks() * 2;

run_tests;

__DATA__

=== TEST 1: empty makefile
--- src
--- dom
MDOM::Document::Gmake








order_only.t
============
use t::GmakeDOM;

plan tests => 2 * blocks();

run_tests;

__DATA__

=== TEST 1:
--- src
foo:|bar;
--- dom
MDOM::Document::Gmake
  MDOM::Rule::Simple
    MDOM::Token::Bare         'foo'
    MDOM::Token::Separator            ':'
    MDOM::Token::Bare            '|'
    MDOM::Token::Bare         'bar'
    MDOM::Command
      MDOM::Token::Separator          ';'
      MDOM::Token::Whitespace         '\n'



=== TEST 2:
--- src
foo: a b| c d
--- dom
MDOM::Document::Gmake
  MDOM::Rule::Simple
    MDOM::Token::Bare         'foo'
    MDOM::Token::Separator            ':'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Bare         'a'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Bare         'b'
    MDOM::Token::Bare         '|'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Bare         'c'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Bare         'd'
    MDOM::Token::Whitespace           '\n'



=== TEST 3:
--- src
foo: a|
--- dom
MDOM::Document::Gmake
  MDOM::Rule::Simple
    MDOM::Token::Bare         'foo'
    MDOM::Token::Separator            ':'
    MDOM::Token::Whitespace           ' '
    MDOM::Token::Bare         'a'
    MDOM::Token::Bare         '|'
    MDOM::Token::Whitespace           '\n'





rule-simple.t
=============
use t::GmakeDOM;

plan tests => blocks() * 2;

run_tests;

__DATA__

=== TEST 1: "hello world" one-linner (with whitespace)
--- src

all : ; echo "hello, world"

--- dom
MDOM::Document::Gmake
  MDOM::Rule::Simple
    MDOM::Token::Bare         'all'
    MDOM::Token::Whitespace   ' '
    MDOM::Token::Separator    ':'
    MDOM::Token::Whitespace   ' '
    MDOM::Command
      MDOM::Token::Separator    ';'
      MDOM::Token::Whitespace   ' '
      MDOM::Token::Bare         'echo "hello, world"'
      MDOM::Token::Whitespace   '\n'



=== TEST 2: "hello world" one-linner (without whitespace)
--- src

all:;echo "hello, world"

--- dom
MDOM::Document::Gmake
  MDOM::Rule::Simple
    MDOM::Token::Bare         'all'
    MDOM::Token::Separator    ':'
    MDOM::Command
      MDOM::Token::Separator    ';'
      MDOM::Token::Bare         'echo "hello, world"'
      MDOM::Token::Whitespace   '\n'



=== TEST 3: "hello world" makefile
--- src

all:
	echo "hello, world"

--- dom
MDOM::Document::Gmake
  MDOM::Rule::Simple
    MDOM::Token::Bare         'all'
    MDOM::Token::Separator    ':'
    MDOM::Token::Whitespace   '\n'
  MDOM::Command
    MDOM::Token::Separator    '\t'
    MDOM::Token::Bare         'echo "hello, world"'
    MDOM::Token::Whitespace   '\n'



=== TEST 4: multiple commands
--- src

all  :
	pwd
	cp t/a t/b
	perl -e 'print "hello, world!\n"'

--- dom
MDOM::Document::Gmake
  MDOM::Rule::Simple
    MDOM::Token::Bare           'all'
    MDOM::Token::Whitespace     '  '
    MDOM::Token::Separator      ':'
    MDOM::Token::Whitespace     '\n'
  MDOM::Command
    MDOM::Token::Separator      '\t'
    MDOM::Token::Bare           'pwd'
    MDOM::Token::Whitespace     '\n'
  MDOM::Command
    MDOM::Token::Separator      '\t'
    MDOM::Token::Bare           'cp t/a t/b'
    MDOM::Token::Whitespace     '\n'
  MDOM::Command
    MDOM::Token::Separator      '\t'
    MDOM::Token::Bare           'perl -e \'print "hello, world!\n"\''
    MDOM::Token::Whitespace     '\n'



=== TEST 5: simple rule with an empty command
--- src

a: b ;

--- dom
MDOM::Document::Gmake
  MDOM::Rule::Simple
    MDOM::Token::Bare           'a'
    MDOM::Token::Separator      ':'
    MDOM::Token::Whitespace     ' '
    MDOM::Token::Bare           'b'
    MDOM::Token::Whitespace     ' '
    MDOM::Command
      MDOM::Token::Separator    ';'
      MDOM::Token::Whitespace   '\n'



=== TEST 6: simple rule without any commands
--- src

a : b

--- dom
MDOM::Document::Gmake
  MDOM::Rule::Simple
    MDOM::Token::Bare           'a'
    MDOM::Token::Whitespace     ' '
    MDOM::Token::Separator      ':'
    MDOM::Token::Whitespace     ' '
    MDOM::Token::Bare           'b'
    MDOM::Token::Whitespace     '\n'



=== TEST 7: weird target/prereq names
--- src

@a: @b @c+!

--- dom
MDOM::Document::Gmake
  MDOM::Rule::Simple
    MDOM::Token::Bare           '@a'
    MDOM::Token::Separator      ':'
    MDOM::Token::Whitespace     ' '
    MDOM::Token::Bare           '@b'
    MDOM::Token::Whitespace     ' '
    MDOM::Token::Bare           '@c+!'
    MDOM::Token::Whitespace     '\n'



=== TEST 8: line continuations in prereq list and weird target names
--- src

@a:\
	 @b   @c

@b : ;
@c:;;

--- dom
MDOM::Document::Gmake
  MDOM::Rule::Simple
    MDOM::Token::Bare          '@a'
    MDOM::Token::Separator     ':'
    MDOM::Token::Continuation  '\\n'
    MDOM::Token::Whitespace    '\t '
    MDOM::Token::Bare          '@b'
    MDOM::Token::Whitespace    '   '
    MDOM::Token::Bare          '@c'
    MDOM::Token::Whitespace    '\n'
  MDOM::Token::Whitespace      '\n'
  MDOM::Rule::Simple
    MDOM::Token::Bare          '@b'
    MDOM::Token::Whitespace    ' '
    MDOM::Token::Separator     ':'
    MDOM::Token::Whitespace    ' '
    MDOM::Command
      MDOM::Token::Separator   ';'
      MDOM::Token::Whitespace  '\n'
  MDOM::Rule::Simple
    MDOM::Token::Bare          '@c'
    MDOM::Token::Separator     ':'
    MDOM::Command
      MDOM::Token::Separator   ';'
      MDOM::Token::Bare        ';'
      MDOM::Token::Whitespace  '\n'



=== TEST 9: line continuations in prereq list
--- src

a: \
	b\
    c \
    d

--- dom
MDOM::Document::Gmake
  MDOM::Rule::Simple
    MDOM::Token::Bare           'a'
    MDOM::Token::Separator      ':'
    MDOM::Token::Whitespace     ' '
    MDOM::Token::Continuation   '\\n'
    MDOM::Token::Whitespace     '\t'
    MDOM::Token::Bare           'b'
    MDOM::Token::Continuation   '\\n'
    MDOM::Token::Whitespace     '    '
    MDOM::Token::Bare           'c'
    MDOM::Token::Whitespace     ' '
    MDOM::Token::Continuation   '\\n'
    MDOM::Token::Whitespace     '    '
    MDOM::Token::Bare           'd'
    MDOM::Token::Whitespace     '\n'



=== TEST 10: suffix (-like) rules
--- src

.SUFFIXES:

.c.o:
	echo "hello $<!"

--- dom
MDOM::Document::Gmake
  MDOM::Rule::Simple
    MDOM::Token::Bare         '.SUFFIXES'
    MDOM::Token::Separator            ':'
    MDOM::Token::Whitespace           '\n'
  MDOM::Token::Whitespace             '\n'
  MDOM::Rule::Simple
    MDOM::Token::Bare                 '.c.o'
    MDOM::Token::Separator            ':'
    MDOM::Token::Whitespace           '\n'
  MDOM::Command
    MDOM::Token::Separator            '\t'
    MDOM::Token::Bare         'echo "hello '
    MDOM::Token::Interpolation                '$<'
    MDOM::Token::Bare         '!"'
    MDOM::Token::Whitespace           '\n'



=== TEST 11: special targets:
--- src

.SECONDEXPAN:

/tmp/foo.o:

--- dom
MDOM::Document::Gmake
  MDOM::Rule::Simple
    MDOM::Token::Bare         '.SECONDEXPAN'
    MDOM::Token::Separator            ':'
    MDOM::Token::Whitespace           '\n'
  MDOM::Token::Whitespace             '\n'
  MDOM::Rule::Simple
    MDOM::Token::Bare         '/tmp/foo.o'
    MDOM::Token::Separator            ':'
    MDOM::Token::Whitespace           '\n'








rule-static-pattern.t
=====================
use t::GmakeDOM;

plan tests => blocks() * 2;

run_tests;

__DATA__

=== TEST 1: static pattern rules with ";" command
--- src

foo.o bar.o: %.o: %.c ; echo blah

%.c: ; echo $@

--- dom
MDOM::Document::Gmake
  MDOM::Rule::StaticPattern
    MDOM::Token::Bare           'foo.o'
    MDOM::Token::Whitespace     ' '
    MDOM::Token::Bare           'bar.o'
    MDOM::Token::Separator      ':'
    MDOM::Token::Whitespace     ' '
    MDOM::Token::Bare           '%.o'
    MDOM::Token::Separator      ':'
    MDOM::Token::Whitespace     ' '
    MDOM::Token::Bare           '%.c'
    MDOM::Token::Whitespace     ' '
    MDOM::Command
      MDOM::Token::Separator    ';'
      MDOM::Token::Whitespace   ' '
      MDOM::Token::Bare         'echo blah'
      MDOM::Token::Whitespace   '\n'
  MDOM::Token::Whitespace       '\n'
  MDOM::Rule::Simple
    MDOM::Token::Bare           '%.c'
    MDOM::Token::Separator      ':'
    MDOM::Token::Whitespace     ' '
    MDOM::Command
      MDOM::Token::Separator    ';'
      MDOM::Token::Whitespace   ' '
      MDOM::Token::Bare         'echo '
      MDOM::Token::Interpolation    '$@'
      MDOM::Token::Whitespace       '\n'



=== TEST 2: static pattern rules without ";" commands
--- src

foo.o bar.o: %.o: %.c
	@echo blah

--- dom
MDOM::Document::Gmake
  MDOM::Rule::StaticPattern
    MDOM::Token::Bare          'foo.o'
    MDOM::Token::Whitespace    ' '
    MDOM::Token::Bare          'bar.o'
    MDOM::Token::Separator     ':'
    MDOM::Token::Whitespace    ' '
    MDOM::Token::Bare          '%.o'
    MDOM::Token::Separator     ':'
    MDOM::Token::Whitespace    ' '
    MDOM::Token::Bare          '%.c'
    MDOM::Token::Whitespace    '\n'
  MDOM::Command
    MDOM::Token::Separator     '\t'
    MDOM::Token::Modifier      '@'
    MDOM::Token::Bare          'echo blah'
    MDOM::Token::Whitespace    '\n'







unknown.t
=========
use t::GmakeDOM;

plan tests => blocks() * 2;

run_tests;

__DATA__

=== TEST 1: unknown entities
--- src

a $(foo)
	echo $@

--- dom
MDOM::Document::Gmake
  MDOM::Unknown
    MDOM::Token::Bare               'a '
    MDOM::Token::Interpolation      '$(foo)'
    MDOM::Token::Whitespace         '\n'
  MDOM::Unknown
    MDOM::Token::Bare               '\techo '
    MDOM::Token::Interpolation      '$@'
    MDOM::Token::Whitespace         '\n'




