(register-test

'(suite "haml"
        ("build a function to render a given haml string with the given arguments"
         (pre-compile '(render-as-haml ".funny#my-id hello ~context.name this file was in ~(just source.name)."))
         (string-pieces
          "<div class='funny' id='my-id'>hello "
          (interpolate (hash-get context 'name))
          " this file was in "
          (interpolate (hash-get source 'name))
          ".</div>\n"))

        ("render a plain haml string to html"
         (render-as-haml "%h1 header text

%p paragraph text

%ul

%li item 1
%li item 2

“)

"<h1>header text</h1>

<p>paragraph text</p> <ul>

<li>item 1</li>
<li>item 2</li>

</ul>n“)

("compile a string with interpolations to an instruction to generate haml"
 (pre-compile '(render-as-haml "%h1 HEADER

%p ~a and ~b and ~(c 3)

%ul

%li item ~(assign counter (+ counter 1))
%li item ~(assign counter (+ counter 1))
%li item ~(assign counter (+ counter 1))

“))

 (string-pieces "<h1>HEADER</h1>\n<p>"
                (interpolate a) " and " (interpolate b) " and " (interpolate (c 3))
                "</p>\n<ul>\n  <li>item " (interpolate (assign counter (+ counter 1)))
                "</li>\n  <li>item " (interpolate (assign counter (+ counter 1)))
                "</li>\n  <li>item " (interpolate (assign counter (+ counter 1)))
                "</li>\n</ul>\n"))

("compile a string with interpolations inside embedded textile to an instruction to generate haml"
 (pre-compile '(render-as-haml "%h1 HEADER

:textile

* a is ~a
* b is ~b
* c is ~(c 3)

“))

 (string-pieces "<h1>HEADER</h1>\n<ul>\n\t<li>a is " (interpolate a)
                "</li>\n\t<li>b is " (interpolate b)
                "</li>\n\t<li>c is " (interpolate (c 3))
                "</li>\n</ul>\n"))

("compile a function invocation to render as haml"
 (pre-compile '(render-as-haml a))
 (haml-to-html a))

("compile a plain string with no interpolations to an instruction to generate haml"
 (pre-compile '(render-as-haml "%h1 HEADER

%p para

%ul

%li item 1
%li item 2

“))

"<h1>HEADER</h1>

<p>para</p> <ul>

<li>item 1</li>
<li>item 2</li>

</ul> “)

("compile a simple string with one interpolation to render html"
 (pre-compile '(render-as-haml "hello ~name "))
 (string-pieces "hello " (interpolate name) "\n"))

("render a simple string with one interpolation to html"
 (let name "conan"
      (render-as-haml "hello ~name"))
 "hello conan\n")

("render a string with interpolations to html"
 (with (a 1 b 2 c (fn (x) (* 2 x)) counter 0)
       (render-as-haml "%h1 HEADER

%p ~a and ~b and ~(c 3)

%ul

%li item ~(assign counter (+ counter 1))
%li item ~(assign counter (+ counter 1))
%li item ~(assign counter (+ counter 1))

“))

"<h1>HEADER</h1>

<p>1 and 2 and 6</p> <ul>

<li>item 1</li>
<li>item 2</li>
<li>item 3</li>

</ul> “)

("render correctly even when HAML re-orders attributes"
 (with (a 'big b 'little c "http://link")
       (render-as-haml "

%a(href='~|c|' class='~|a|' alt='~|b|')

%img(src='~|c|' alt='~|b|' title='~|a|')

“))

        "<a alt='little' class='big' href='http://link'>
<img alt='little' src='http://link' title='big'>

</a> “)

("render a string with nested haml to html"
 (with (a (list 1 2 3) b "hello")
       (render-as-haml "%h1 HEADER

%p ~b world

~(mapx a x (render-as-haml “

.x<
  this x is ~x
.y<
  and y is ~(* 2 x)

“)) ”))

"<h1>HEADER</h1>

<p>hello world</p> <div class='x'>this x is 1</div> <div class='y'>and y is 2</div> <div class='x'>this x is 2</div> <div class='y'>and y is 4</div> <div class='x'>this x is 3</div> <div class='y'>and y is 6</div>

“)

("render a variable to html"
 (with (a "%p hello, world") (render-as-haml a))

 "<p>hello, world</p>\n")

))