citeproc-ruby 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +78 -0
- data/lib/citeproc.rb +100 -0
- data/lib/citeproc/bibliography.rb +57 -0
- data/lib/citeproc/data.rb +149 -0
- data/lib/citeproc/date.rb +133 -0
- data/lib/citeproc/formatter.rb +38 -0
- data/lib/citeproc/item.rb +53 -0
- data/lib/citeproc/name.rb +284 -0
- data/lib/citeproc/processor.rb +166 -0
- data/lib/citeproc/selector.rb +61 -0
- data/lib/citeproc/variable.rb +82 -0
- data/lib/citeproc/version.rb +3 -0
- data/lib/csl/locale.rb +223 -0
- data/lib/csl/node.rb +72 -0
- data/lib/csl/nodes.rb +1364 -0
- data/lib/csl/renderer.rb +88 -0
- data/lib/csl/sort.rb +53 -0
- data/lib/csl/style.rb +110 -0
- data/lib/csl/term.rb +124 -0
- data/lib/extensions/core.rb +43 -0
- data/lib/plugins/filters/bibtex.rb +12 -0
- data/lib/plugins/formats/default.rb +134 -0
- data/lib/plugins/formats/html.rb +67 -0
- data/lib/support/attributes.rb +99 -0
- data/lib/support/tree.rb +80 -0
- data/resource/locale/locales-af-ZA.xml +304 -0
- data/resource/locale/locales-ar-AR.xml +304 -0
- data/resource/locale/locales-bg-BG.xml +304 -0
- data/resource/locale/locales-ca-AD.xml +304 -0
- data/resource/locale/locales-cs-CZ.xml +304 -0
- data/resource/locale/locales-da-DK.xml +304 -0
- data/resource/locale/locales-de-AT.xml +304 -0
- data/resource/locale/locales-de-CH.xml +304 -0
- data/resource/locale/locales-de-DE.xml +332 -0
- data/resource/locale/locales-el-GR.xml +303 -0
- data/resource/locale/locales-en-US.xml +313 -0
- data/resource/locale/locales-es-ES.xml +304 -0
- data/resource/locale/locales-et-EE.xml +304 -0
- data/resource/locale/locales-fr-FR.xml +304 -0
- data/resource/locale/locales-he-IL.xml +304 -0
- data/resource/locale/locales-hu-HU.xml +304 -0
- data/resource/locale/locales-is-IS.xml +304 -0
- data/resource/locale/locales-it-IT.xml +304 -0
- data/resource/locale/locales-ja-JP.xml +304 -0
- data/resource/locale/locales-kh-KH.xml +303 -0
- data/resource/locale/locales-ko-KR.xml +304 -0
- data/resource/locale/locales-mn-MN.xml +304 -0
- data/resource/locale/locales-nb-NO.xml +304 -0
- data/resource/locale/locales-nl-NL.xml +304 -0
- data/resource/locale/locales-nn-NO.xml +304 -0
- data/resource/locale/locales-pl-PL.xml +304 -0
- data/resource/locale/locales-pt-BR.xml +304 -0
- data/resource/locale/locales-pt-PT.xml +304 -0
- data/resource/locale/locales-ro-RO.xml +304 -0
- data/resource/locale/locales-ru-RU.xml +304 -0
- data/resource/locale/locales-sk-SK.xml +304 -0
- data/resource/locale/locales-sl-SI.xml +304 -0
- data/resource/locale/locales-sr-RS.xml +304 -0
- data/resource/locale/locales-sv-SE.xml +304 -0
- data/resource/locale/locales-th-TH.xml +304 -0
- data/resource/locale/locales-tr-TR.xml +304 -0
- data/resource/locale/locales-uk-UA.xml +304 -0
- data/resource/locale/locales-vi-VN.xml +304 -0
- data/resource/locale/locales-zh-CN.xml +304 -0
- data/resource/locale/locales-zh-TW.xml +304 -0
- data/resource/schema/csl-categories.rnc +39 -0
- data/resource/schema/csl-data.rnc +98 -0
- data/resource/schema/csl-terms.rnc +106 -0
- data/resource/schema/csl-types.rnc +39 -0
- data/resource/schema/csl-variables.rnc +182 -0
- data/resource/schema/csl.rnc +941 -0
- data/resource/style/acta-materialia-x.csl +128 -0
- data/resource/style/advanced-engineering-materials-x.csl +121 -0
- data/resource/style/ama.csl +185 -0
- data/resource/style/ama2-x.csl +179 -0
- data/resource/style/apa-x.csl +324 -0
- data/resource/style/apa.csl +254 -0
- data/resource/style/apsa-x.csl +163 -0
- data/resource/style/apsa.csl +176 -0
- data/resource/style/asa-x.csl +203 -0
- data/resource/style/asa.csl +216 -0
- data/resource/style/asm-journals-x.csl +131 -0
- data/resource/style/bibtex-x2.csl +175 -0
- data/resource/style/bluebook-demo-x.csl +392 -0
- data/resource/style/bluebook-demo.csl +942 -0
- data/resource/style/chicago-author-date-listing.csl +434 -0
- data/resource/style/chicago-author-date.csl +369 -0
- data/resource/style/chicago-fullnote-bibliography-bb.csl +928 -0
- data/resource/style/chicago-fullnote-bibliography.csl +695 -0
- data/resource/style/chicago-note-bibliography.csl +446 -0
- data/resource/style/chicago-note.csl +388 -0
- data/resource/style/greek-chicago-x.csl +1182 -0
- data/resource/style/harvard1-institution-italic.csl +190 -0
- data/resource/style/harvard1.csl +181 -0
- data/resource/style/ieee.csl +129 -0
- data/resource/style/mhra-x.csl +312 -0
- data/resource/style/mhra.csl +390 -0
- data/resource/style/mhra_note_without_bibliography-x.csl +330 -0
- data/resource/style/mhra_note_without_bibliography.csl +338 -0
- data/resource/style/mla-x.csl +178 -0
- data/resource/style/mla.csl +189 -0
- data/resource/style/nature-x.csl +81 -0
- data/resource/style/nature.csl +88 -0
- data/resource/style/nlm.csl +117 -0
- data/spec/citeproc/bibliography_spec.rb +45 -0
- data/spec/citeproc/citeproc_spec.rb +76 -0
- data/spec/citeproc/date_spec.rb +85 -0
- data/spec/citeproc/formatter_spec.rb +101 -0
- data/spec/citeproc/item_spec.rb +71 -0
- data/spec/citeproc/name_spec.rb +30 -0
- data/spec/citeproc/processor_spec.rb +61 -0
- data/spec/citeproc/selector_spec.rb +82 -0
- data/spec/citeproc/variable_spec.rb +69 -0
- data/spec/csl/locale_spec.rb +208 -0
- data/spec/csl/node_spec.rb +25 -0
- data/spec/csl/nodes_spec.rb +140 -0
- data/spec/csl/style_spec.rb +62 -0
- data/spec/csl/term_spec.rb +56 -0
- data/spec/fixtures/dates.yaml +80 -0
- data/spec/fixtures/names.yaml +115 -0
- data/spec/fixtures/nodes.yaml +245 -0
- data/spec/spec_helper.rb +18 -0
- data/spec/support/attributes_spec.rb +39 -0
- data/spec/support/tree_spec.rb +163 -0
- metadata +264 -0
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
---
|
|
2
|
+
- class: CSL::Nodes::Text
|
|
3
|
+
describe:
|
|
4
|
+
processing:
|
|
5
|
+
returns an empty string by default:
|
|
6
|
+
input:
|
|
7
|
+
- <text/>
|
|
8
|
+
expected:
|
|
9
|
+
- ""
|
|
10
|
+
item: {}
|
|
11
|
+
format: default
|
|
12
|
+
handles terms correctly:
|
|
13
|
+
item: {}
|
|
14
|
+
format: default
|
|
15
|
+
input:
|
|
16
|
+
- <text term="editorial-director" plural="false" />
|
|
17
|
+
- <text term="editorial-director" plural="true" />
|
|
18
|
+
- <text term="section" form="symbol" plural="false" />
|
|
19
|
+
- <text term="section" form="symbol" plural="true" />
|
|
20
|
+
expected:
|
|
21
|
+
- editor
|
|
22
|
+
- editors
|
|
23
|
+
- §
|
|
24
|
+
- §§
|
|
25
|
+
- class: CSL::Nodes::Number
|
|
26
|
+
describe:
|
|
27
|
+
processing:
|
|
28
|
+
returns an empty string by default:
|
|
29
|
+
format: default
|
|
30
|
+
input:
|
|
31
|
+
- <number/>
|
|
32
|
+
expected:
|
|
33
|
+
- ""
|
|
34
|
+
item: {}
|
|
35
|
+
supports variables and return numeric value by default:
|
|
36
|
+
format: default
|
|
37
|
+
item:
|
|
38
|
+
edition: '3'
|
|
39
|
+
input:
|
|
40
|
+
- <number variable="edition"/>
|
|
41
|
+
expected:
|
|
42
|
+
- '3'
|
|
43
|
+
supports ordinals and roman numbers:
|
|
44
|
+
format: default
|
|
45
|
+
item:
|
|
46
|
+
issue: '1'
|
|
47
|
+
volume: '2'
|
|
48
|
+
edition: '3'
|
|
49
|
+
number: '23'
|
|
50
|
+
input:
|
|
51
|
+
- <number variable="issue" form="ordinal"/>
|
|
52
|
+
- <number variable="volume" form="ordinal"/>
|
|
53
|
+
- <number variable="edition" form="ordinal"/>
|
|
54
|
+
- <number variable="number" form="ordinal"/>
|
|
55
|
+
- <number variable="issue" form="long-ordinal"/>
|
|
56
|
+
- <number variable="volume" form="long-ordinal"/>
|
|
57
|
+
- <number variable="edition" form="long-ordinal"/>
|
|
58
|
+
- <number variable="issue" form="roman"/>
|
|
59
|
+
- <number variable="volume" form="roman"/>
|
|
60
|
+
- <number variable="edition" form="roman"/>
|
|
61
|
+
- <number variable="number" form="roman"/>
|
|
62
|
+
- <number variable="number" form="roman" text-case="uppercase"/>
|
|
63
|
+
expected:
|
|
64
|
+
- 1st
|
|
65
|
+
- 2nd
|
|
66
|
+
- 3rd
|
|
67
|
+
- 23rd
|
|
68
|
+
- first
|
|
69
|
+
- second
|
|
70
|
+
- third
|
|
71
|
+
- i
|
|
72
|
+
- ii
|
|
73
|
+
- iii
|
|
74
|
+
- xxiii
|
|
75
|
+
- XXIII
|
|
76
|
+
- class: CSL::Nodes::Date
|
|
77
|
+
describe:
|
|
78
|
+
localized processing:
|
|
79
|
+
returns an empty string by default for numeric:
|
|
80
|
+
format: default
|
|
81
|
+
item: {}
|
|
82
|
+
input:
|
|
83
|
+
- <date form="numeric"/>
|
|
84
|
+
expected:
|
|
85
|
+
- ""
|
|
86
|
+
returns an empty string by default for text:
|
|
87
|
+
format: default
|
|
88
|
+
item: {}
|
|
89
|
+
input:
|
|
90
|
+
- <date form="text"/>
|
|
91
|
+
expected:
|
|
92
|
+
- ""
|
|
93
|
+
returns numeric result given date-parts:
|
|
94
|
+
format: default
|
|
95
|
+
item:
|
|
96
|
+
issued:
|
|
97
|
+
date-parts:
|
|
98
|
+
- - 1983
|
|
99
|
+
- 3
|
|
100
|
+
- 12
|
|
101
|
+
input:
|
|
102
|
+
- <date variable="issued" form="numeric"/>
|
|
103
|
+
- <date variable="issued" form="numeric" date-parts="year-month-day"/>
|
|
104
|
+
- <date variable="issued" form="numeric" date-parts="year-month"/>
|
|
105
|
+
- <date variable="issued" form="numeric" date-parts="year"/>
|
|
106
|
+
expected:
|
|
107
|
+
- '03/12/1983'
|
|
108
|
+
- '03/12/1983'
|
|
109
|
+
- '03/1983'
|
|
110
|
+
- '1983'
|
|
111
|
+
returns numeric season correctly:
|
|
112
|
+
format: default
|
|
113
|
+
item:
|
|
114
|
+
issued:
|
|
115
|
+
date-parts:
|
|
116
|
+
- - 1983
|
|
117
|
+
- 3
|
|
118
|
+
- 12
|
|
119
|
+
season: 1
|
|
120
|
+
input:
|
|
121
|
+
- <date variable="issued" form="numeric"/>
|
|
122
|
+
- <date variable="issued" form="numeric" date-parts="year-month-day"/>
|
|
123
|
+
- <date variable="issued" form="numeric" date-parts="year-month"/>
|
|
124
|
+
- <date variable="issued" form="numeric" date-parts="year"/>
|
|
125
|
+
expected:
|
|
126
|
+
- 'Spring/12/1983'
|
|
127
|
+
- 'Spring/12/1983'
|
|
128
|
+
- 'Spring/1983'
|
|
129
|
+
- '1983'
|
|
130
|
+
returns string-numeric season correctly:
|
|
131
|
+
format: default
|
|
132
|
+
item:
|
|
133
|
+
issued:
|
|
134
|
+
date-parts:
|
|
135
|
+
- - 1983
|
|
136
|
+
- 3
|
|
137
|
+
- 12
|
|
138
|
+
season: '2'
|
|
139
|
+
input:
|
|
140
|
+
- <date variable="issued" form="numeric"/>
|
|
141
|
+
- <date variable="issued" form="numeric" date-parts="year-month-day"/>
|
|
142
|
+
- <date variable="issued" form="numeric" date-parts="year-month"/>
|
|
143
|
+
- <date variable="issued" form="numeric" date-parts="year"/>
|
|
144
|
+
expected:
|
|
145
|
+
- 'Summer/12/1983'
|
|
146
|
+
- 'Summer/12/1983'
|
|
147
|
+
- 'Summer/1983'
|
|
148
|
+
- '1983'
|
|
149
|
+
returns literal season correctly:
|
|
150
|
+
format: default
|
|
151
|
+
item:
|
|
152
|
+
issued:
|
|
153
|
+
date-parts:
|
|
154
|
+
- - 1983
|
|
155
|
+
- 3
|
|
156
|
+
- 12
|
|
157
|
+
season: 'THE SEASON'
|
|
158
|
+
input:
|
|
159
|
+
- <date variable="issued" form="numeric"/>
|
|
160
|
+
- <date variable="issued" form="numeric" date-parts="year-month-day"/>
|
|
161
|
+
- <date variable="issued" form="numeric" date-parts="year-month"/>
|
|
162
|
+
- <date variable="issued" form="numeric" date-parts="year"/>
|
|
163
|
+
expected:
|
|
164
|
+
- 'THE SEASON/12/1983'
|
|
165
|
+
- 'THE SEASON/12/1983'
|
|
166
|
+
- 'THE SEASON/1983'
|
|
167
|
+
- '1983'
|
|
168
|
+
returns text result given date-parts:
|
|
169
|
+
format: default
|
|
170
|
+
item:
|
|
171
|
+
issued:
|
|
172
|
+
date-parts:
|
|
173
|
+
- - 1983
|
|
174
|
+
- 3
|
|
175
|
+
- 7
|
|
176
|
+
input:
|
|
177
|
+
- <date variable="issued" form="text"/>
|
|
178
|
+
- <date variable="issued" form="text" date-parts="year-month-day"/>
|
|
179
|
+
- <date variable="issued" form="text" date-parts="year-month"/>
|
|
180
|
+
- <date variable="issued" form="text" date-parts="year"/>
|
|
181
|
+
expected:
|
|
182
|
+
- 'March 07, 1983'
|
|
183
|
+
- 'March 07, 1983'
|
|
184
|
+
- 'March 1983'
|
|
185
|
+
- '1983'
|
|
186
|
+
returns text result given date-parts and overrule:
|
|
187
|
+
format: default
|
|
188
|
+
item:
|
|
189
|
+
issued:
|
|
190
|
+
date-parts:
|
|
191
|
+
- - 1983
|
|
192
|
+
- 3
|
|
193
|
+
- 7
|
|
194
|
+
input:
|
|
195
|
+
- <date variable="issued" form="text"><date-part name="month" form="short"/><date-part name="day" form="numeric"/></date>
|
|
196
|
+
- <date variable="issued" form="text" date-parts="year-month-day"><date-part name="month" form="verb-short"/><date-part name="day" form="numeric"/></date>
|
|
197
|
+
- <date variable="issued" form="text" date-parts="year-month"><date-part name="month" form="short"/><date-part name="day" form="numeric"/></date>
|
|
198
|
+
- <date variable="issued" form="text" date-parts="year"><date-part name="month" form="short"/><date-part name="day" form="numeric"/></date>
|
|
199
|
+
expected:
|
|
200
|
+
- 'Mar. 7, 1983'
|
|
201
|
+
- 'March 7, 1983'
|
|
202
|
+
- 'Mar. 1983'
|
|
203
|
+
- '1983'
|
|
204
|
+
returns text result given date-parts and overrule in HTML:
|
|
205
|
+
format: html
|
|
206
|
+
item:
|
|
207
|
+
issued:
|
|
208
|
+
date-parts:
|
|
209
|
+
- - 1983
|
|
210
|
+
- 3
|
|
211
|
+
- 7
|
|
212
|
+
input:
|
|
213
|
+
- <date variable="issued" form="text"><date-part name="month" form="short"/><date-part name="day" form="numeric"/></date>
|
|
214
|
+
- <date variable="issued" form="text" date-parts="year-month-day"><date-part name="month" form="verb-short" text-case="uppercase"/><date-part name="day" form="numeric"/></date>
|
|
215
|
+
expected:
|
|
216
|
+
- 'Mar. 7, 1983'
|
|
217
|
+
- '<span style="text-transform: uppercase">March </span>7, 1983'
|
|
218
|
+
non-localized processing:
|
|
219
|
+
returns an empty string by default:
|
|
220
|
+
format: default
|
|
221
|
+
item: {}
|
|
222
|
+
input:
|
|
223
|
+
- <date/>
|
|
224
|
+
expected:
|
|
225
|
+
- ""
|
|
226
|
+
returns result given date-parts:
|
|
227
|
+
format: default
|
|
228
|
+
item:
|
|
229
|
+
issued:
|
|
230
|
+
date-parts:
|
|
231
|
+
- - 1983
|
|
232
|
+
- 3
|
|
233
|
+
- 12
|
|
234
|
+
input:
|
|
235
|
+
- <date variable="issued"/>
|
|
236
|
+
- <date variable="issued"><date-part name="year" form="long" suffix="-"/><date-part name="month" form="numeric" suffix="-"/><date-part name="day" form="numeric"/></date>
|
|
237
|
+
- <date variable="issued"><date-part name="year" form="long" suffix="-"/><date-part name="month" form="numeric-leading-zeros" suffix=""/></date>
|
|
238
|
+
- <date variable="issued"><date-part name="year"/><date>
|
|
239
|
+
- <date variable="issued"><date-part name="year" form="short" suffix=" "/><date-part name="month" form="long" suffix=" "/><date-part name="day" form="ordinal"/></date>
|
|
240
|
+
expected:
|
|
241
|
+
- ''
|
|
242
|
+
- '1983-3-12'
|
|
243
|
+
- '1983-03'
|
|
244
|
+
- '1983'
|
|
245
|
+
- '83 March 12th'
|
data/spec/spec_helper.rb
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require 'rubygems'
|
|
2
|
+
require 'citeproc'
|
|
3
|
+
require 'json'
|
|
4
|
+
require 'yaml'
|
|
5
|
+
|
|
6
|
+
RSpec.configuration do |c|
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
module CiteProc
|
|
10
|
+
module Test
|
|
11
|
+
module Fixtures
|
|
12
|
+
Names = YAML.load(File.read(File.expand_path("../fixtures/names.yaml", __FILE__)))
|
|
13
|
+
Dates = YAML.load(File.read(File.expand_path("../fixtures/dates.yaml", __FILE__)))
|
|
14
|
+
Nodes = YAML.load(File.read(File.expand_path("../fixtures/nodes.yaml", __FILE__)))
|
|
15
|
+
Processor = Hash[Dir.glob(File.expand_path("../../resource/test/processor/*.json", __FILE__)).map { |file| [file, JSON.parse(File.read(file))] }]
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Support::Attributes do
|
|
4
|
+
|
|
5
|
+
before(:each) { Object.instance_eval { include Support::Attributes } }
|
|
6
|
+
|
|
7
|
+
let(:instance) { o = Object.new }
|
|
8
|
+
let(:other) { o = Object.new; o['foo'] = 'bar'; o }
|
|
9
|
+
|
|
10
|
+
it { should_not be_nil }
|
|
11
|
+
it { should be_empty }
|
|
12
|
+
|
|
13
|
+
describe '#attributes' do
|
|
14
|
+
|
|
15
|
+
# before(:all) { class Object; attr_fields :value, %w[ is-numeric punctuation-mode ]; end }
|
|
16
|
+
|
|
17
|
+
it 'generates setters for attr_field values' do
|
|
18
|
+
pending
|
|
19
|
+
# lambda { Object.new.is_numeric }.should_not raise_error
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it 'generates no other setters' do
|
|
23
|
+
lambda { Object.new.some_other_value }.should raise_error
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
describe '#merge' do
|
|
28
|
+
|
|
29
|
+
it 'merges non-existent values from other object' do
|
|
30
|
+
Object.new.merge(other)['foo'].should == 'bar'
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# it 'does not overwrite existing values when merging other object' do
|
|
34
|
+
# instance.merge(other)['foo'].should == 'bar'
|
|
35
|
+
# end
|
|
36
|
+
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
end
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Support::Tree do
|
|
4
|
+
|
|
5
|
+
before(:each) { Object.instance_eval { include Support::Tree } }
|
|
6
|
+
|
|
7
|
+
let(:node) { Object.new }
|
|
8
|
+
|
|
9
|
+
describe '#children' do
|
|
10
|
+
context 'when it has no children' do
|
|
11
|
+
it 'returns an empty list' do
|
|
12
|
+
node.children.should be_empty
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
context 'when it has children' do
|
|
17
|
+
before(:each) { node.add_children([Object.new, Object.new, Object.new]) }
|
|
18
|
+
|
|
19
|
+
it 'returns a list of all children' do
|
|
20
|
+
node.children.should have(3).items
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
describe '#name' do
|
|
26
|
+
it 'returns the class name in attribute form by default' do
|
|
27
|
+
node.name.should == 'object'
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
describe '#add_children' do
|
|
32
|
+
it 'adds a single node to the children array' do
|
|
33
|
+
node.add_children(Object.new).children.should have(1).item
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
it 'adds a list of nodes to the children array' do
|
|
37
|
+
node.add_children(Object.new, Object.new).children.should have(2).item
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it 'adds an array of nodes to the children array' do
|
|
41
|
+
node.add_children([Object.new, Object.new]).children.should have(2).item
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it 'sets self as parent of the added nodes' do
|
|
45
|
+
node.add_children([Object.new, Object.new]).children.map(&:parent).uniq.should == [node]
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it 'does not alter the state if no argument given' do
|
|
49
|
+
node.add_children().children.should be_empty
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
it 'does not alter the state if nil argument given' do
|
|
53
|
+
node.add_children(nil).children.should be_empty
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it 'does not alter the state if nil arguments given' do
|
|
57
|
+
node.add_children(nil, nil).children.should be_empty
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
it 'does not alter the state if empty list argument given' do
|
|
61
|
+
node.add_children([]).children.should be_empty
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
it 'does not alter the state if nil list argument given' do
|
|
65
|
+
node.add_children([nil, nil]).children.should be_empty
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
describe '#ancestors' do
|
|
71
|
+
context 'when it has no ancestors' do
|
|
72
|
+
it 'returns and empty list' do
|
|
73
|
+
node.ancestors.should be_empty
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
context 'when it has ancestors' do
|
|
78
|
+
|
|
79
|
+
let(:node1) { node.add_children(Object.new).children[0] }
|
|
80
|
+
let(:node2) { node1.add_children(Object.new).children[0] }
|
|
81
|
+
let(:node3) { node2.add_children(Object.new).children[0] }
|
|
82
|
+
|
|
83
|
+
it 'returns a list containing the ancestors (depth 0)' do
|
|
84
|
+
node.ancestors.should be_empty
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
it 'returns a list containing the ancestors (depth 1)' do
|
|
88
|
+
node1.ancestors.should == [node]
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
it 'returns a list containing the ancestors (depth 2)' do
|
|
92
|
+
node2.ancestors.should == [node1, node]
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
it 'returns a list containing the ancestors (depth 3)' do
|
|
96
|
+
node3.ancestors.should == [node2, node1, node]
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
describe '#root' do
|
|
103
|
+
context 'when it has no ancestors' do
|
|
104
|
+
it 'returns itself' do
|
|
105
|
+
node.root.should == node
|
|
106
|
+
node.should be_root
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
context 'when it has ancestors' do
|
|
111
|
+
|
|
112
|
+
let(:node1) { node.add_children(Object.new).children[0] }
|
|
113
|
+
let(:node2) { node1.add_children(Object.new).children[0] }
|
|
114
|
+
let(:node3) { node2.add_children(Object.new).children[0] }
|
|
115
|
+
|
|
116
|
+
it 'returns the root node (depth 0)' do
|
|
117
|
+
node.root.should == node
|
|
118
|
+
node.should be_root
|
|
119
|
+
node.depth.should == 0
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
it 'returns the root node (depth 1)' do
|
|
123
|
+
node1.root.should == node
|
|
124
|
+
node1.should_not be_root
|
|
125
|
+
node1.depth.should == 1
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
it 'returns the root node (depth 2)' do
|
|
129
|
+
node2.root.should == node
|
|
130
|
+
node2.should_not be_root
|
|
131
|
+
node2.depth.should == 2
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
it 'returns the root node (depth 3)' do
|
|
135
|
+
node3.root.should == node
|
|
136
|
+
node3.should_not be_root
|
|
137
|
+
node3.depth.should == 3
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
describe 'named child accessors' do
|
|
143
|
+
|
|
144
|
+
before(:all) { Object.instance_eval { attr_children :object } }
|
|
145
|
+
|
|
146
|
+
context 'when it has no children' do
|
|
147
|
+
it 'returns an empty list by default' do
|
|
148
|
+
Object.new.object.should be_empty
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
context 'when it has children' do
|
|
153
|
+
it 'returns a list of a single child with the matching name' do
|
|
154
|
+
Object.new.add_children(Object.new).object.should have(1).item
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
it 'returns a list of all children with the matching name' do
|
|
158
|
+
Object.new.add_children(Object.new, Object.new).object.should have(2).items
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
end
|