summaryrefslogtreecommitdiff
path: root/test/psych/test_string.rb
blob: 1ce16fdf3ecc94f3d4e06ec529ec2564e0a5de07 (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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
require_relative 'helper'

module Psych
  class TestString < TestCase
    class X < String
    end

    class Y < String
      attr_accessor :val
    end

    class Z < String
      def initialize
        force_encoding Encoding::US_ASCII
      end
    end

    def test_string_with_newline
      assert_equal "1\n2", Psych.load("--- ! '1\n\n  2'\n")
    end

    def test_no_doublequotes_with_special_characters
      assert_equal 2, Psych.dump(%Q{<%= ENV["PATH"] %>}).count('"')
    end

    def test_doublequotes_when_there_is_a_single
      yaml = Psych.dump "@123'abc"
      assert_match(/---\s*"/, yaml)
    end

    def test_cycle_x
      str = X.new 'abc'
      assert_cycle str
    end

    def test_dash_dot
      assert_cycle '-.'
      assert_cycle '+.'
    end

    def test_string_subclass_with_anchor
      y = Psych.load <<-eoyml
---
body:
  string: &70121654388580 !ruby/string
    str: ! 'foo'
  x:
    body: *70121654388580
      eoyml
      assert_equal({"body"=>{"string"=>"foo", "x"=>{"body"=>"foo"}}}, y)
    end

    def test_self_referential_string
      y = Psych.load <<-eoyml
---
string: &70121654388580 !ruby/string
  str: ! 'foo'
  body: *70121654388580
      eoyml

      assert_equal({"string"=>"foo"}, y)
      value = y['string']
      assert_equal value, value.instance_variable_get(:@body)
    end

    def test_another_subclass_with_attributes
      y = Psych.load Psych.dump Y.new("foo").tap {|y| y.val = 1}
      assert_equal "foo", y
      assert_equal Y, y.class
      assert_equal 1, y.val
    end

    def test_backwards_with_syck
      x = Psych.load "--- !str:#{X.name} foo\n\n"
      assert_equal X, x.class
      assert_equal 'foo', x
    end

    def test_empty_subclass
      assert_match "!ruby/string:#{X}", Psych.dump(X.new)
      x = Psych.load Psych.dump X.new
      assert_equal X, x.class
    end

    def test_empty_character_subclass
      assert_match "!ruby/string:#{Z}", Psych.dump(Z.new)
      x = Psych.load Psych.dump Z.new
      assert_equal Z, x.class
    end

    def test_subclass_with_attributes
      y = Psych.load Psych.dump Y.new.tap {|y| y.val = 1}
      assert_equal Y, y.class
      assert_equal 1, y.val
    end

    def test_string_with_base_60
      yaml = Psych.dump '01:03:05'
      assert_match "'01:03:05'", yaml
      assert_equal '01:03:05', Psych.load(yaml)
    end

    def test_nonascii_string_as_binary
      string = "hello \x80 world!"
      string.force_encoding 'ascii-8bit'
      yml = Psych.dump string
      assert_match(/binary/, yml)
      assert_equal string, Psych.load(yml)
    end

    def test_binary_string_null
      string = "\x00"
      yml = Psych.dump string
      assert_match(/binary/, yml)
      assert_equal string, Psych.load(yml)
    end

    def test_binary_string
      string = binary_string
      yml = Psych.dump string
      assert_match(/binary/, yml)
      assert_equal string, Psych.load(yml)
    end

    def test_non_binary_string
      string = binary_string(0.29)
      yml = Psych.dump string
      refute_match(/binary/, yml)
      assert_equal string, Psych.load(yml)
    end

    def test_ascii_only_8bit_string
      string = "abc".encode(Encoding::ASCII_8BIT)
      yml = Psych.dump string
      refute_match(/binary/, yml)
      assert_equal string, Psych.load(yml)
    end

    def test_string_with_ivars
      food = "is delicious"
      ivar = "on rock and roll"
      food.instance_variable_set(:@we_built_this_city, ivar)

      Psych.load Psych.dump food
      assert_equal ivar, food.instance_variable_get(:@we_built_this_city)
    end

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

    def test_float_confusion
      assert_cycle '1.'
    end

    def binary_string percentage = 0.31, length = 100
      string = ''
      (percentage * length).to_i.times do |i|
        string << "\b"
      end
      string << 'a' * (length - string.length)
      string
    end
  end
end