summaryrefslogtreecommitdiff
path: root/test/visitors/test_yast_builder.rb
blob: ec7446253a766c24df7765ffd9ee55872ea7f0d8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
require 'minitest/autorun'
require 'psych'

module Psych
  module Visitors
    class TestYASTBuilder < MiniTest::Unit::TestCase
      def setup
        @v = Visitors::YASTBuilder.new
      end

      def test_circular_list
        a = []
        2.times { a << a }
        assert_equal a.inspect, Psych.load(a.to_yaml).inspect
      end

      def test_circular_map
        a = {}
        a[a] = a
        assert_equal a.inspect, Psych.load(a.to_yaml).inspect
      end

      def test_scalar
        assert_round_trip 'foo'
        assert_round_trip ':foo'
        assert_round_trip ''
      end

      def test_boolean
        assert_round_trip true
        assert_round_trip 'true'
        assert_round_trip false
        assert_round_trip 'false'
      end

      def test_range_inclusive
        assert_round_trip 1..2
      end

      def test_range_exclusive
        assert_round_trip 1...2
      end

      def test_binary
        string = [0, 123,22, 44, 9, 32, 34, 39].pack('C*')
        assert_equal string, Psych.load(string.to_yaml)
      end

      def test_anon_class
        assert_raises(TypeError) do
          @v.accept Class.new
        end

        assert_raises(TypeError) do
          Class.new.to_yaml
        end
      end

      def test_hash
        assert_round_trip('a' => 'b')
      end

      def test_list
        assert_round_trip(%w{ a b })
        assert_round_trip([1, 2.2])
      end

      def test_symbol
        assert_round_trip :foo
      end

      def test_int
        assert_round_trip 1
        assert_round_trip(-1)
        assert_round_trip '1'
        assert_round_trip '-1'
      end

      def test_float
        assert_round_trip 1.2
        assert_round_trip '1.2'

        assert Psych.load(Psych.dump(0.0 / 0.0)).nan?
        assert_equal 1, Psych.load(Psych.dump(1 / 0.0)).infinite?
        assert_equal(-1, Psych.load(Psych.dump(-1 / 0.0)).infinite?)
      end

      # http://yaml.org/type/null.html
      def test_nil
        assert_round_trip nil
        assert_equal nil, Psych.load('null')
        assert_equal nil, Psych.load('Null')
        assert_equal nil, Psych.load('NULL')
        assert_equal nil, Psych.load('~')
        assert_equal({'foo' => nil}, Psych.load('foo: '))

        assert_round_trip 'null'
        assert_round_trip 'nUll'
        assert_round_trip '~'
      end

      def assert_round_trip obj
        v = Visitors::YASTBuilder.new
        v.accept(obj)
        assert_equal(obj, Psych.load(v.tree.to_yaml))
        assert_equal(obj, Psych.load(obj.to_yaml))
        assert_equal(obj, Psych.load(Psych.dump(obj)))
      end
    end
  end
end