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
|
require_relative '../../spec_helper'
require_relative 'fixtures/common'
require_relative 'fixtures/strings'
describe "YAML.load" do
after :each do
rm_r $test_file
end
it "returns a document from current io stream when io provided" do
File.open($test_file, 'w') do |io|
YAML.dump( ['badger', 'elephant', 'tiger'], io )
end
File.open($test_file) { |yf| YAML.load( yf ) }.should == ['badger', 'elephant', 'tiger']
end
it "loads strings" do
strings = ["str",
" str",
"'str'",
"str",
" str",
"'str'",
"\"str\"",
"\n str",
"--- str",
"---\nstr",
"--- \nstr",
"--- \n str",
"--- 'str'"
]
strings.each do |str|
YAML.load(str).should == "str"
end
end
it "loads strings with chars from non-base Unicode plane" do
# We add these strings as bytes and force the encoding for safety
# as bugs in parsing unicode characters can obscure bugs in this
# area.
yaml_and_strings = {
# "--- 🌵" => "🌵"
[45, 45, 45, 32, 240, 159, 140, 181] =>
[240, 159, 140, 181],
# "--- 🌵 and some text" => "🌵 and some text"
[45, 45, 45, 32, 240, 159, 140, 181, 32, 97, 110, 100, 32, 115, 111, 109, 101, 32, 116, 101, 120, 116] =>
[240, 159, 140, 181, 32, 97, 110, 100, 32, 115, 111, 109, 101, 32, 116, 101, 120, 116],
# "--- Some text 🌵 and some text" => "Some text 🌵 and some text"
[45, 45, 45, 32, 83, 111, 109, 101, 32, 116, 101, 120, 116, 32, 240, 159, 140, 181, 32, 97, 110, 100, 32, 115, 111, 109, 101, 32, 116, 101, 120, 116] =>
[83, 111, 109, 101, 32, 116, 101, 120, 116, 32, 240, 159, 140, 181, 32, 97, 110, 100, 32, 115, 111, 109, 101, 32, 116, 101, 120, 116]
}
yaml_and_strings.each do |yaml, str|
YAML.load(yaml.pack("C*").force_encoding("UTF-8")).should == str.pack("C*").force_encoding("UTF-8")
end
end
it "fails on invalid keys" do
if YAML.to_s == "Psych"
error = Psych::SyntaxError
else
error = ArgumentError
end
-> { YAML.load("key1: value\ninvalid_key") }.should raise_error(error)
end
it "accepts symbols" do
YAML.load( "--- :locked" ).should == :locked
end
it "accepts numbers" do
YAML.load("47").should == 47
YAML.load("-1").should == -1
end
it "accepts collections" do
expected = ["a", "b", "c"]
YAML.load("--- \n- a\n- b\n- c\n").should == expected
YAML.load("--- [a, b, c]").should == expected
YAML.load("[a, b, c]").should == expected
end
it "parses start markers" do
YAML.load("---\n").should == nil
YAML.load("--- ---\n").should == "---"
YAML.load("--- abc").should == "abc"
end
it "works with block sequence shortcuts" do
block_seq = "- - - one\n - two\n - three"
YAML.load(block_seq).should == [[["one", "two", "three"]]]
end
it "works on complex keys" do
require 'date'
expected = {
[ 'Detroit Tigers', 'Chicago Cubs' ] => [ Date.new( 2001, 7, 23 ) ],
[ 'New York Yankees', 'Atlanta Braves' ] => [ Date.new( 2001, 7, 2 ),
Date.new( 2001, 8, 12 ),
Date.new( 2001, 8, 14 ) ]
}
YAML.unsafe_load($complex_key_1).should == expected
end
it "loads a symbol key that contains spaces" do
string = ":user name: This is the user name."
expected = { :"user name" => "This is the user name."}
YAML.load(string).should == expected
end
describe "with iso8601 timestamp" do
it "computes the microseconds" do
[ [YAML.unsafe_load("2011-03-22t23:32:11.2233+01:00"), 223300],
[YAML.unsafe_load("2011-03-22t23:32:11.0099+01:00"), 9900],
[YAML.unsafe_load("2011-03-22t23:32:11.000076+01:00"), 76]
].should be_computed_by(:usec)
end
it "rounds values smaller than 1 usec to 0 " do
YAML.unsafe_load("2011-03-22t23:32:11.000000342222+01:00").usec.should == 0
end
end
it "loads an OpenStruct" do
require "ostruct"
os = OpenStruct.new("age" => 20, "name" => "John")
loaded = YAML.unsafe_load("--- !ruby/object:OpenStruct\ntable:\n :age: 20\n :name: John\n")
loaded.should == os
end
it "loads a File but raise an error when used as it is uninitialized" do
loaded = YAML.unsafe_load("--- !ruby/object:File {}\n")
-> {
loaded.read(1)
}.should raise_error(IOError)
end
end
|