The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
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'