diff --git a/testdata/ruby/layMacro.rb b/testdata/ruby/layMacro.rb
new file mode 100644
index 000000000..e246e4030
--- /dev/null
+++ b/testdata/ruby/layMacro.rb
@@ -0,0 +1,184 @@
+# encoding: UTF-8
+
+# KLayout Layout Viewer
+# Copyright (C) 2006-2021 Matthias Koefferlein
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+if !$:.member?(File::dirname($0))
+ $:.push(File::dirname($0))
+end
+
+load("test_prologue.rb")
+
+class LAYMacro_TestClass < TestBase
+
+ def test_1
+
+ macro = RBA::Macro::new
+
+ macro.version = "1.7"
+ assert_equal(macro.version, "1.7")
+
+ macro.doc = "%doc"
+ assert_equal(macro.doc, "%doc")
+
+ macro.description = "%description"
+ assert_equal(macro.description, "%description")
+
+ macro.prolog = "%prolog"
+ assert_equal(macro.prolog, "%prolog")
+
+ macro.epilog = "%epilog"
+ assert_equal(macro.epilog, "%epilog")
+
+ macro.category = "%category"
+ assert_equal(macro.category, "%category")
+
+ macro.shortcut = "%shortcut"
+ assert_equal(macro.shortcut, "%shortcut")
+
+ assert_equal(macro.is_autorun?, false)
+ macro.is_autorun = true
+ assert_equal(macro.is_autorun?, true)
+
+ assert_equal(macro.is_autorun_early?, false)
+ macro.is_autorun_early = true
+ assert_equal(macro.is_autorun_early?, true)
+
+ macro.format = RBA::Macro::PlainTextFormat
+ assert_equal(macro.format == RBA::Macro::PlainTextFormat, true)
+ macro.format = RBA::Macro::MacroFormat
+ assert_equal(macro.format == RBA::Macro::MacroFormat, true)
+
+ macro.interpreter = RBA::Macro::Ruby
+ assert_equal(macro.interpreter == RBA::Macro::Ruby, true)
+ assert_equal(macro.interpreter_name, "Ruby")
+ macro.interpreter = RBA::Macro::Python
+ assert_equal(macro.interpreter == RBA::Macro::Python, true)
+ assert_equal(macro.interpreter_name, "Python")
+
+ macro.dsl_interpreter = "%dsl"
+ assert_equal(macro.dsl_interpreter, "%dsl")
+
+ macro.text = "%text"
+ macro.format = RBA::Macro::PlainTextWithHashAnnotationsFormat
+ assert_equal(macro.text, "%text")
+ macro.sync_text_with_properties
+ assert_equal(macro.text, "# $description: %description\n" +
+ "# $prolog: %prolog\n" +
+ "# $epilog: %epilog\n" +
+ "# $version: 1.7\n" +
+ "# $autorun\n" +
+ "# $autorun-early\n" +
+ "# $shortcut: %shortcut\n" +
+ "%text")
+
+ macro.text = "# $description: %description\n" +
+ "# $prolog: %prolog\n" +
+ "# $epilog: %epilog\n" +
+ "# $version: 7.1\n" +
+ "# $autorun\n" +
+ "# $autorun-early\n" +
+ "# $shortcut: %shortcut\n" +
+ "%text"
+ macro.sync_properties_with_text
+ assert_equal(macro.version, "7.1")
+
+ macro.group_name = "%group"
+ assert_equal(macro.group_name, "%group")
+
+ assert_equal(macro.show_in_menu?, false)
+ macro.show_in_menu = true
+ assert_equal(macro.show_in_menu?, true)
+
+ macro.menu_path = "menu.path"
+ assert_equal(macro.menu_path, "menu.path")
+
+ end
+
+ def test_2
+
+ macro_file = File.join($ut_testtmp, "test.lym")
+ File.open(macro_file, "w") do |file|
+ file.write(<<"END")
+
+
+ %description
+ 42
+ ruby
+
+$test_output = "x" + $test_input
+
+
+END
+ end
+
+ macro = RBA::Macro::new(macro_file)
+ assert_equal(macro.description, "%description")
+ assert_equal(macro.path, macro_file)
+
+ $test_input = "42"
+ $test_output = ""
+ macro.run
+ assert_equal($test_output, "x42")
+
+ macro_file2 = File.join($ut_testtmp, "test2.lym")
+ macro.save_to(macro_file2)
+
+ macro2 = RBA::Macro::new(macro_file2)
+ assert_equal(macro2.path, macro_file2)
+
+ end
+
+ def test_3
+
+ pya = RBA::Interpreter.python_interpreter
+ if !pya
+ return
+ end
+
+ macro_file = File.join($ut_testtmp, "test.lym")
+ File.open(macro_file, "w") do |file|
+ file.write(<<"END")
+
+
+ %description
+ 42
+ python
+
+print("Python calling!")
+context.value = "x" + context.value
+
+
+END
+ end
+
+ macro = RBA::Macro::new(macro_file)
+ assert_equal(macro.description, "%description")
+ assert_equal(macro.path, macro_file)
+
+ context = RBA::Value::new
+ context.value = "42"
+ pya.define_variable("context", context)
+
+ macro.run
+ assert_equal(context.value, "x42")
+
+ end
+
+end
+
+load("test_epilogue.rb")