test/test_vm.rb in jsonnet-0.0.1 vs test/test_vm.rb in jsonnet-0.0.2

- old
+ new

@@ -1,30 +1,65 @@ +# -*- coding: UTF-8 -*- require 'jsonnet' require 'json' +require 'tempfile' require 'test/unit' class TestVM < Test::Unit::TestCase test 'Jsonnet::VM#evaluate_file evaluates file' do vm = Jsonnet::VM.new - result = vm.evaluate_file example_file('example.jsonnet') - - assert_equal JSON.parse(<<-EOS), JSON.parse(result) + with_example_file(%< + local myvar = 1; + { + ["foo" + myvar]: myvar, + } + >) {|fname| + result = vm.evaluate_file(fname) + assert_equal JSON.parse(<<-EOS), JSON.parse(result) {"foo1": 1} - EOS + EOS + } end test 'Jsonnet::VM#evaluate_file raises an EvaluationError on error' do vm = Jsonnet::VM.new - assert_raise(Jsonnet::EvaluationError) do - vm.evaluate_file example_file('error.jsonnet') + with_example_file(%< + { + // unbound variable + ["foo" + myvar]: myvar, + } + >) {|fname| + assert_raise(Jsonnet::EvaluationError) do + vm.evaluate_file(fname) + end + } + end + + test "Jsonnet::VM#evaluate_file returns the same encoding as source" do + vm = Jsonnet::VM.new + with_example_file(%Q{ ["テスト"] }.encode(Encoding::EUC_JP)) {|fname| + result = vm.evaluate_file(fname, encoding: Encoding::EUC_JP) + assert_equal Encoding::EUC_JP, result.encoding + } + end + + test "Jsonnet::VM#evaluate_file raises an error in the encoding of filename" do + vm = Jsonnet::VM.new + begin + with_example_file(%q{ ["unterminated string }) {|fname| + vm.evaluate_file(fname.encode(Encoding::SJIS)) + } + rescue Jsonnet::EvaluationError => e + assert_equal Encoding::SJIS, e.message.encoding end end + test 'Jsonnet::VM#evaluate evaluates snippet' do vm = Jsonnet::VM.new - result = vm.evaluate(<<-EOS, 'example.snippet') + result = vm.evaluate(<<-EOS, filename: 'example.snippet') local myvar = 1; { ["foo" + myvar]: myvar, } EOS @@ -49,20 +84,191 @@ end test 'Jsonnet::VM#evaluate raises an EvaluationError on error' do vm = Jsonnet::VM.new assert_raise(Jsonnet::EvaluationError) do - vm.evaluate(<<-EOS, 'example.snippet') + vm.evaluate(<<-EOS, filename: 'example.snippet') { // unbound variable ["foo" + myvar]: myvar, } EOS end end + test "Jsonnet::VM#evaluate returns the same encoding as source" do + vm = Jsonnet::VM.new + result = vm.evaluate(%Q{ ["テスト"] }.encode(Encoding::EUC_JP)) + assert_equal Encoding::EUC_JP, result.encoding + end + + test "Jsonnet::VM#evaluate raises an error in the encoding of filename" do + vm = Jsonnet::VM.new + begin + vm.evaluate(%Q{ ["unterminated string }, filename: "テスト.json".encode(Encoding::SJIS)) + rescue Jsonnet::EvaluationError => e + assert_equal Encoding::SJIS, e.message.encoding + end + end + + test "Jsonnet::VM#ext_var binds a variable" do + vm = Jsonnet::VM.new + vm.ext_var("var1", "foo") + result = vm.evaluate('[std.extVar("var1")]') + assert_equal JSON.parse('["foo"]'), JSON.parse(result) + end + + test 'Jsonnet::VM#evaluate returns a JSON per filename on multi mode' do + vm = Jsonnet::VM.new + [ + [ "{}", {} ], + [ + %< + local myvar = 1; + { ["foo" + myvar]: [myvar] } + >, + { + 'foo1' => [1], + } + ], + [ + %< + local myvar = 1; + { + ["foo" + myvar]: [myvar], + ["bar" + myvar]: { + ["baz" + (myvar+1)]: myvar+1, + }, + } + >, + { + 'foo1' => [1], + 'bar1' => {'baz2' => 2}, + } + ], + ].each do |jsonnet, expected| + result = vm.evaluate(jsonnet, multi: true) + assert_equal expected.keys.sort, result.keys.sort + expected.each do |fname, value| + assert_not_nil result[fname] + assert_equal value, JSON.parse(result[fname]) + end + end + end + + test 'Jsonnet::VM#evaluate_file returns a JSON per filename on multi mode' do + vm = Jsonnet::VM.new + [ + [ "{}", {} ], + [ + %< + local myvar = 1; + { ["foo" + myvar]: [myvar] } + >, + { + 'foo1' => [1], + } + ], + [ + %< + local myvar = 1; + { + ["foo" + myvar]: [myvar], + ["bar" + myvar]: { + ["baz" + (myvar+1)]: myvar+1, + }, + } + >, + { + 'foo1' => [1], + 'bar1' => {'baz2' => 2}, + } + ], + ].each do |jsonnet, expected| + with_example_file(jsonnet) {|fname| + result = vm.evaluate_file(fname, multi: true) + assert_equal expected.keys.sort, result.keys.sort + expected.each do |fname, value| + assert_not_nil result[fname] + assert_equal value, JSON.parse(result[fname]) + end + } + end + end + + test "Jsonnet::VM responds to max_stack=" do + Jsonnet::VM.new.max_stack = 1 + end + + test "Jsonnet::VM responds to gc_min_objects=" do + Jsonnet::VM.new.gc_min_objects = 1 + end + + test "Jsonnet::VM responds to gc_growth_trigger=" do + Jsonnet::VM.new.gc_growth_trigger = 1.5 + end + + test "Jsonnet::VM responds to max_trace=" do + Jsonnet::VM.new.max_trace = 1 + end + + test "Jsonnet::VM responds to debug_ast=" do + Jsonnet::VM.new.debug_ast = true + end + + test "Jsonnet::VM#string_output lets the VM output a raw string" do + vm = Jsonnet::VM.new + vm.string_output = true + assert_equal "foo\n", vm.evaluate(%q[ "foo" ]) + vm.string_output = false + assert_equal ["foo"], JSON.parse(vm.evaluate(%q[ ["foo"] ])) + end + + test "Jsonnet::VM#import_callback customizes import file resolution" do + vm = Jsonnet::VM.new + vm.import_callback = ->(base, rel) { + case [base, rel] + when ['/path/to/base/', 'imported1.jsonnet'] + return <<-EOS, '/path/to/imported1/imported1.jsonnet' + import "imported2.jsonnet" { + b: 2, + } + EOS + when ['/path/to/imported1/', "imported2.jsonnet"] + return <<-EOS, '/path/to/imported2/imported2.jsonnet' + { a: 1 } + EOS + else + raise Errno::ENOENT, "#{rel} at #{base}" + end + } + result = vm.evaluate(<<-EOS, filename: "/path/to/base/example.jsonnet") + import "imported1.jsonnet" { c: 3 } + EOS + + expected = {"a" => 1, "b" => 2, "c" => 3} + assert_equal expected, JSON.parse(result) + end + + test "Jsonnet::VM#evaluate returns an error if customized import callback raises an exception" do + vm = Jsonnet::VM.new + called = false + vm.import_callback = ->(base, rel) { called = true; raise } + assert_raise(Jsonnet::EvaluationError) { + vm.evaluate(<<-EOS) + import "a.jsonnet" {} + EOS + } + assert_true called + end + private - def example_file(name) - File.join(File.dirname(__FILE__), name) + def with_example_file(content) + Tempfile.open("example.jsonnet") {|f| + f.print content + f.flush + f.rewind + yield f.path + } end end