defmodule Temple.Ast.NonvoidElementsAliasesTest do
  use ExUnit.Case, async: true

  alias Temple.Ast.NonvoidElementsAliases
  alias Temple.Ast.ElementList
  alias Temple.Ast.Text

  describe "applicable?/1" do
    test "returns true when the node is a nonvoid element or alias" do
      raw_asts = [
        quote do
          div do
            "foo"
          end
        end,
        quote do
          select__ do
            option do
              "Label"
            end
          end
        end
      ]

      for raw_ast <- raw_asts do
        assert NonvoidElementsAliases.applicable?(raw_ast)
      end
    end

    test "returns false when the node is anything other than a nonvoid element or alias" do
      raw_asts = [
        quote do
          Temple.div do
            "foo"
          end
        end,
        quote do
          link to: "/the/route" do
            "Label"
          end
        end
      ]

      for raw_ast <- raw_asts do
        refute NonvoidElementsAliases.applicable?(raw_ast)
      end
    end
  end

  describe "run/2" do
    test "adds a node to the buffer" do
      raw_ast =
        quote do
          div class: "foo", id: var do
            select__ do
              option do
                "foo"
              end
            end
          end
        end

      ast = NonvoidElementsAliases.run(raw_ast)

      assert %NonvoidElementsAliases{
               name: "div",
               attrs: [class: "foo", id: {:var, [], _}],
               children: %ElementList{
                 children: [
                   %NonvoidElementsAliases{
                     name: "select",
                     children: %ElementList{
                       children: [
                         %NonvoidElementsAliases{
                           name: "option",
                           children: %ElementList{
                             children: [
                               %Text{text: "foo"}
                             ]
                           }
                         }
                       ]
                     }
                   }
                 ]
               }
             } = ast
    end
  end
end
