summaryrefslogtreecommitdiff
path: root/test/test_generator.rb
blob: d9a4074a0144c4a1cf20d044b18f3def80f3f469 (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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
require 'test/unit'
require 'plist'

class SerializableObject
  attr_accessor :foo

  def initialize(str)
    @foo = str
  end

  def to_plist_node
    return "<string>#{CGI.escapeHTML(@foo)}</string>"
  end
end

class TestGenerator < Test::Unit::TestCase
  def test_to_plist_vs_plist_emit_dump_no_envelope
    source = [1, :b, true]

    to_plist = source.to_plist(false)
    plist_emit_dump = Plist::Emit.dump(source, false)

    assert_equal to_plist, plist_emit_dump
  end

  def test_to_plist_vs_plist_emit_dump_with_envelope
    source   = [1, :b, true]

    to_plist = source.to_plist
    plist_emit_dump = Plist::Emit.dump(source)

    assert_equal to_plist, plist_emit_dump
  end

  def test_dumping_serializable_object
    str = 'this object implements #to_plist_node'
    so = SerializableObject.new(str)

    assert_equal "<string>#{str}</string>", Plist::Emit.dump(so, false)
  end

  def test_write_plist
    data = [1, :two, {:c => 'dee'}]

    data.save_plist('test.plist')
    file = File.open('test.plist') {|f| f.read}

    assert_equal file, data.to_plist

    File.unlink('test.plist')
  end

  # The hash in this test was failing with 'hsh.keys.sort',
  # we are making sure it works with 'hsh.keys.sort_by'.
  def test_sorting_keys
    hsh = {:key1 => 1, :key4 => 4, 'key2' => 2, :key3 => 3}
    output = Plist::Emit.dump(hsh, false)
    expected = <<-STR
<dict>
  <key>key1</key>
  <integer>1</integer>
  <key>key2</key>
  <integer>2</integer>
  <key>key3</key>
  <integer>3</integer>
  <key>key4</key>
  <integer>4</integer>
</dict>
    STR

    assert_equal expected, output.gsub(/[\t]/, "\s\s")
  end

  def test_custom_indent
    hsh = { :key1 => 1, 'key2' => 2 }
    output_plist_dump_with_envelope = Plist::Emit.dump(hsh, true, :indent => nil)
    output_plist_dump_no_envelope = Plist::Emit.dump(hsh, false, :indent => nil)

    expected_with_envelope = <<-STR
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>key1</key>
<integer>1</integer>
<key>key2</key>
<integer>2</integer>
</dict>
</plist>
STR

    expected_no_envelope = <<-STR
<dict>
<key>key1</key>
<integer>1</integer>
<key>key2</key>
<integer>2</integer>
</dict>
STR
    assert_equal expected_with_envelope, output_plist_dump_with_envelope
    assert_equal expected_no_envelope, output_plist_dump_no_envelope

    hsh.save_plist('test.plist', :indent => nil)
    output_plist_file = File.read('test.plist')
    assert_equal expected_with_envelope, output_plist_file
    File.unlink('test.plist')
  end

  def test_string_containing_newlines
    source = {
      data: {
        a_multiline_string: "This is a string with\nmultiple line\nbreaks.",
        a_normal_string: "This is a string without a line break.",
        integer: 100
      }
    }
    plist_emit_dump = Plist::Emit.dump(source, true)
    assert_equal(<<-EXPECTED, plist_emit_dump.gsub(/\t/, "  "))
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>data</key>
  <dict>
    <key>a_multiline_string</key>
    <string>This is a string with
multiple line
breaks.</string>
    <key>a_normal_string</key>
    <string>This is a string without a line break.</string>
    <key>integer</key>
    <integer>100</integer>
  </dict>
</dict>
</plist>
EXPECTED
  end
end