#!/usr/bin/env bin/crystal --run require "../../spec_helper" describe "Code gen: macro" do it "expands macro" do run("macro foo; 1 + 2; end; foo").to_i.should eq(3) end it "expands macro with arguments" do run(%( macro foo(n) {{n}} + 2 end foo(1) )).to_i.should eq(3) end it "expands macro that invokes another macro" do run(%( macro foo def x 1 + 2 end end macro bar foo end bar x )).to_i.should eq(3) end it "expands macro defined in class" do run(%( class Foo macro foo def bar 1 end end foo end foo = Foo.new foo.bar )).to_i.should eq(1) end it "expands macro defined in base class" do run(%( class Object macro foo def bar 1 end end end class Foo foo end foo = Foo.new foo.bar )).to_i.should eq(1) end it "expands inline macro" do run(%( a = {{ 1 }} a )).to_i.should eq(1) end it "expands inline macro for" do run(%( a = 0 {% for i in [1, 2, 3] } a += {{i}} {% end } a )).to_i.should eq(6) end it "expands inline macro if (true)" do run(%( a = 0 {% if 1 == 1 } a += 1 {% end } a )).to_i.should eq(1) end it "expands inline macro if (false)" do run(%( a = 0 {% if 1 == 2 } a += 1 {% end } a )).to_i.should eq(0) end it "finds macro in class" do run(%( class Foo macro foo 1 + 2 end def bar foo end end Foo.new.bar )).to_i.should eq(3) end end