hyper-d3 1.0.0.lap23
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +313 -0
- data/README.md +118 -0
- data/Rakefile +31 -0
- data/hyper-d3.gemspec +27 -0
- data/lib/d3.rb +68 -0
- data/lib/d3/arc.rb +29 -0
- data/lib/d3/area.rb +53 -0
- data/lib/d3/axis.rb +79 -0
- data/lib/d3/band_scale.rb +30 -0
- data/lib/d3/collections.rb +9 -0
- data/lib/d3/color.rb +76 -0
- data/lib/d3/color_schemes.rb +34 -0
- data/lib/d3/continuous_scale.rb +60 -0
- data/lib/d3/creator.rb +11 -0
- data/lib/d3/curve.rb +74 -0
- data/lib/d3/dsv.rb +103 -0
- data/lib/d3/ease.rb +319 -0
- data/lib/d3/format.rb +95 -0
- data/lib/d3/histograms.rb +46 -0
- data/lib/d3/interpolate.rb +125 -0
- data/lib/d3/line.rb +27 -0
- data/lib/d3/map.rb +48 -0
- data/lib/d3/misc.rb +15 -0
- data/lib/d3/native.rb +112 -0
- data/lib/d3/nest.rb +100 -0
- data/lib/d3/ordinal_scale.rb +39 -0
- data/lib/d3/path.rb +24 -0
- data/lib/d3/pie.rb +25 -0
- data/lib/d3/point_scale.rb +27 -0
- data/lib/d3/polygon.rb +18 -0
- data/lib/d3/quadtree.rb +89 -0
- data/lib/d3/quantile_scale.rb +19 -0
- data/lib/d3/quantize_scale.rb +20 -0
- data/lib/d3/radial_area.rb +55 -0
- data/lib/d3/radial_line.rb +27 -0
- data/lib/d3/random.rb +14 -0
- data/lib/d3/search.rb +30 -0
- data/lib/d3/selection.rb +151 -0
- data/lib/d3/sequential_scale.rb +31 -0
- data/lib/d3/set.rb +30 -0
- data/lib/d3/source/d3-drag.js +234 -0
- data/lib/d3/source/d3-scale-chromatic.js +484 -0
- data/lib/d3/source/d3.js +17178 -0
- data/lib/d3/stack.rb +13 -0
- data/lib/d3/statistics.rb +81 -0
- data/lib/d3/symbol.rb +70 -0
- data/lib/d3/threshold_scale.rb +22 -0
- data/lib/d3/time_format.rb +47 -0
- data/lib/d3/time_interval.rb +85 -0
- data/lib/d3/transformations.rb +16 -0
- data/lib/hyper-d3.rb +17 -0
- data/lib/hyperloop/d3/component.rb +12 -0
- data/lib/hyperloop/d3/mixin.rb +59 -0
- data/lib/hyperloop/d3/version.rb +5 -0
- data/spec/arc_spec.rb +80 -0
- data/spec/area_spec.rb +98 -0
- data/spec/axis_spec.rb +174 -0
- data/spec/band_scale_spec.rb +73 -0
- data/spec/color_spec.rb +74 -0
- data/spec/continuous_scale_spec.rb +217 -0
- data/spec/coverage_spec.rb +16 -0
- data/spec/creator_spec.rb +15 -0
- data/spec/curve_spec.rb +206 -0
- data/spec/dsv_spec.rb +194 -0
- data/spec/ease_spec.rb +370 -0
- data/spec/format_spec.rb +87 -0
- data/spec/histograms_spec.rb +61 -0
- data/spec/html/index.html.erb +11 -0
- data/spec/interpolate_spec.rb +152 -0
- data/spec/line_spec.rb +54 -0
- data/spec/map_spec.rb +80 -0
- data/spec/misc_spec.rb +21 -0
- data/spec/nest_spec.rb +89 -0
- data/spec/objects_spec.rb +22 -0
- data/spec/ordinal_scale_spec.rb +59 -0
- data/spec/path_spec.rb +65 -0
- data/spec/pie_spec.rb +114 -0
- data/spec/point_scale_spec.rb +58 -0
- data/spec/polygon_spec.rb +51 -0
- data/spec/quadtree_spec.rb +128 -0
- data/spec/quantile_scale_spec.rb +24 -0
- data/spec/quantize_scale_spec.rb +40 -0
- data/spec/radial_area_spec.rb +123 -0
- data/spec/radial_line_spec.rb +50 -0
- data/spec/random_spec.rb +34 -0
- data/spec/search_spec.rb +69 -0
- data/spec/selection_data_spec.rb +64 -0
- data/spec/selection_manipulation_spec.rb +166 -0
- data/spec/selection_spec.rb +187 -0
- data/spec/sequential_scale_spec.rb +90 -0
- data/spec/set_spec.rb +57 -0
- data/spec/spec_helper.rb +1 -0
- data/spec/stack_spec.rb +5 -0
- data/spec/statistics_spec.rb +65 -0
- data/spec/symbol_spec.rb +116 -0
- data/spec/test_app/.gitignore +23 -0
- data/spec/test_app/Gemfile +7 -0
- data/spec/test_app/Gemfile.lock +206 -0
- data/spec/test_app/README.md +9 -0
- data/spec/test_app/Rakefile +6 -0
- data/spec/test_app/app/assets/config/manifest.js +3 -0
- data/spec/test_app/app/assets/images/.keep +0 -0
- data/spec/test_app/app/assets/javascripts/application.js +13 -0
- data/spec/test_app/app/assets/javascripts/cable.js +13 -0
- data/spec/test_app/app/assets/javascripts/channels/.keep +0 -0
- data/spec/test_app/app/assets/javascripts/data/elections_2016.rb +10 -0
- data/spec/test_app/app/assets/javascripts/data/harry_potter.rb +19 -0
- data/spec/test_app/app/assets/javascripts/data/iphones.rb +29 -0
- data/spec/test_app/app/assets/javascripts/data/london_population.rb +26 -0
- data/spec/test_app/app/assets/javascripts/data/man_vs_horse.rb +55 -0
- data/spec/test_app/app/assets/javascripts/data/mtg_modern_colors.rb +96 -0
- data/spec/test_app/app/assets/javascripts/data/mtg_modern_creatures.rb +116 -0
- data/spec/test_app/app/assets/javascripts/data/olympics_2016_medals.rb +100 -0
- data/spec/test_app/app/assets/javascripts/data/paradox.rb +60 -0
- data/spec/test_app/app/assets/javascripts/data/polish_pms.rb +28 -0
- data/spec/test_app/app/assets/javascripts/data/star_trek_voyager.rb +183 -0
- data/spec/test_app/app/assets/javascripts/data/weather_in_london.rb +381 -0
- data/spec/test_app/app/assets/javascripts/elections_2016.rb +27 -0
- data/spec/test_app/app/assets/javascripts/harry_potter.rb +42 -0
- data/spec/test_app/app/assets/javascripts/iphones.rb +54 -0
- data/spec/test_app/app/assets/javascripts/london_population.rb +53 -0
- data/spec/test_app/app/assets/javascripts/london_population_area.rb +49 -0
- data/spec/test_app/app/assets/javascripts/man_vs_horse.rb +60 -0
- data/spec/test_app/app/assets/javascripts/mtg_modern_colors.rb +56 -0
- data/spec/test_app/app/assets/javascripts/mtg_modern_creatures.rb +70 -0
- data/spec/test_app/app/assets/javascripts/olympics_2016_medals.rb +62 -0
- data/spec/test_app/app/assets/javascripts/paradox.rb +64 -0
- data/spec/test_app/app/assets/javascripts/polish_pms.rb +60 -0
- data/spec/test_app/app/assets/javascripts/star_trek_voyager.rb +44 -0
- data/spec/test_app/app/assets/javascripts/weather_in_london.rb +69 -0
- data/spec/test_app/app/assets/stylesheets/application.css +15 -0
- data/spec/test_app/app/channels/application_cable/channel.rb +4 -0
- data/spec/test_app/app/channels/application_cable/connection.rb +4 -0
- data/spec/test_app/app/controllers/application_controller.rb +27 -0
- data/spec/test_app/app/controllers/concerns/.keep +0 -0
- data/spec/test_app/app/helpers/application_helper.rb +2 -0
- data/spec/test_app/app/jobs/application_job.rb +2 -0
- data/spec/test_app/app/mailers/application_mailer.rb +4 -0
- data/spec/test_app/app/models/application_record.rb +3 -0
- data/spec/test_app/app/models/concerns/.keep +0 -0
- data/spec/test_app/app/views/application/index.erb +18 -0
- data/spec/test_app/app/views/application/visualization.erb +28 -0
- data/spec/test_app/app/views/layouts/application.html.erb +13 -0
- data/spec/test_app/bin/bundle +3 -0
- data/spec/test_app/bin/rails +4 -0
- data/spec/test_app/bin/rake +4 -0
- data/spec/test_app/bin/setup +38 -0
- data/spec/test_app/bin/update +29 -0
- data/spec/test_app/bin/yarn +11 -0
- data/spec/test_app/config.ru +5 -0
- data/spec/test_app/config/application.rb +18 -0
- data/spec/test_app/config/boot.rb +3 -0
- data/spec/test_app/config/cable.yml +10 -0
- data/spec/test_app/config/database.yml +25 -0
- data/spec/test_app/config/environment.rb +5 -0
- data/spec/test_app/config/environments/development.rb +54 -0
- data/spec/test_app/config/environments/production.rb +91 -0
- data/spec/test_app/config/environments/test.rb +42 -0
- data/spec/test_app/config/initializers/application_controller_renderer.rb +8 -0
- data/spec/test_app/config/initializers/assets.rb +14 -0
- data/spec/test_app/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/test_app/config/initializers/cookies_serializer.rb +5 -0
- data/spec/test_app/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/test_app/config/initializers/inflections.rb +16 -0
- data/spec/test_app/config/initializers/mime_types.rb +4 -0
- data/spec/test_app/config/initializers/wrap_parameters.rb +14 -0
- data/spec/test_app/config/locales/en.yml +33 -0
- data/spec/test_app/config/puma.rb +56 -0
- data/spec/test_app/config/routes.rb +5 -0
- data/spec/test_app/config/secrets.yml +32 -0
- data/spec/test_app/config/spring.rb +6 -0
- data/spec/test_app/db/seeds.rb +7 -0
- data/spec/test_app/lib/assets/.keep +0 -0
- data/spec/test_app/lib/tasks/.keep +0 -0
- data/spec/test_app/log/.keep +0 -0
- data/spec/test_app/package.json +5 -0
- data/spec/test_app/public/404.html +67 -0
- data/spec/test_app/public/422.html +67 -0
- data/spec/test_app/public/500.html +66 -0
- data/spec/test_app/public/apple-touch-icon-precomposed.png +0 -0
- data/spec/test_app/public/apple-touch-icon.png +0 -0
- data/spec/test_app/public/favicon.ico +0 -0
- data/spec/test_app/public/robots.txt +1 -0
- data/spec/test_app/test/application_system_test_case.rb +5 -0
- data/spec/test_app/test/controllers/.keep +0 -0
- data/spec/test_app/test/fixtures/.keep +0 -0
- data/spec/test_app/test/fixtures/files/.keep +0 -0
- data/spec/test_app/test/helpers/.keep +0 -0
- data/spec/test_app/test/integration/.keep +0 -0
- data/spec/test_app/test/mailers/.keep +0 -0
- data/spec/test_app/test/models/.keep +0 -0
- data/spec/test_app/test/system/.keep +0 -0
- data/spec/test_app/test/test_helper.rb +10 -0
- data/spec/test_app/tmp/.keep +0 -0
- data/spec/test_app/vendor/.keep +0 -0
- data/spec/threshold_scale_spec.rb +28 -0
- data/spec/time_format_spec.rb +100 -0
- data/spec/time_interval_spec.rb +314 -0
- data/spec/transformations_spec.rb +51 -0
- data/startrekvoyager.png +0 -0
- metadata +529 -0
data/spec/area_spec.rb
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
describe "d3 - area" do
|
2
|
+
it "d3.area" do
|
3
|
+
expect(D3.area).to be_instance_of(D3::AreaGenerator)
|
4
|
+
end
|
5
|
+
|
6
|
+
let(:simple_data) {[
|
7
|
+
{year: 2007, value: 93.24},
|
8
|
+
{year: 2008, value: 95.35},
|
9
|
+
{year: 2009, value: 98.84},
|
10
|
+
{year: 2010, value: 99.92},
|
11
|
+
{year: 2011, value: 99.80},
|
12
|
+
{year: 2014, value: 99.47},
|
13
|
+
]}
|
14
|
+
|
15
|
+
describe "basics" do
|
16
|
+
let(:area) {
|
17
|
+
D3.area
|
18
|
+
.x{|d| (d[:year]-2000)*10 }
|
19
|
+
.y1{|d| d[:value] }
|
20
|
+
.y0(50)
|
21
|
+
}
|
22
|
+
it "basics" do
|
23
|
+
expect(area.(simple_data)).to eq(
|
24
|
+
"M70,93.24L80,95.35L90,98.84L100,99.92L110,99.8L140,99.47L140,50L110,50L100,50L90,50L80,50L70,50Z"
|
25
|
+
)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "curve" do
|
29
|
+
expect(area.curve).to be_instance_of(D3::Curve)
|
30
|
+
expect(area.curve(D3.curve_natural).(simple_data)).to eq(%W[
|
31
|
+
M70,93.24
|
32
|
+
C73.3652312599681,93.76974481658695,76.7304625199362,94.29948963317388,80,95.35
|
33
|
+
C83.2695374800638,96.40051036682611,86.4433811802233,97.97178628389153,90,98.84
|
34
|
+
C93.5566188197767,99.70821371610847,97.49601275917065,99.87336523125998,100,99.92
|
35
|
+
C102.50398724082935,99.96663476874002,103.5725677830941,99.89475279106857,110,99.8
|
36
|
+
C116.4274322169059,99.70524720893143,128.21371610845296,99.5876236044657,140,99.47L140,50
|
37
|
+
C128.21371610845296,50,116.4274322169059,50,110,50
|
38
|
+
C103.5725677830941,50,102.50398724082936,50,100,50
|
39
|
+
C97.49601275917064,50,93.55661881977672,50,90,50
|
40
|
+
C86.44338118022328,50,83.2695374800638,50,80,50
|
41
|
+
C76.7304625199362,50,73.3652312599681,50,70,50Z
|
42
|
+
].join)
|
43
|
+
end
|
44
|
+
|
45
|
+
it ".defined" do
|
46
|
+
expect(area.defined{|d| d[:year] != 2010}.(simple_data)).to eq(
|
47
|
+
"M70,93.24L80,95.35L90,98.84L90,50L80,50L70,50ZM110,99.8L140,99.47L140,50L110,50Z"
|
48
|
+
)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe "line generators" do
|
53
|
+
let(:area) {
|
54
|
+
D3.area
|
55
|
+
.x0{|d| (d[:year]-2000)*10 }
|
56
|
+
.x1{|d| (d[:year]-2000)*20 }
|
57
|
+
.y1{|d| d[:value] }
|
58
|
+
.y0(50)
|
59
|
+
}
|
60
|
+
let(:point) { {year: 2042, value: 117 } }
|
61
|
+
|
62
|
+
it ".x/.x0/.x1" do
|
63
|
+
expect(area.x0.(point)).to eq(420)
|
64
|
+
expect(area.x1.(point)).to eq(840)
|
65
|
+
expect(area.x.(point)).to eq(420)
|
66
|
+
end
|
67
|
+
|
68
|
+
it ".y/.y0/.y1" do
|
69
|
+
expect(area.y0.(point)).to eq(50)
|
70
|
+
expect(area.y1.(point)).to eq(117)
|
71
|
+
expect(area.y.(point)).to eq(50)
|
72
|
+
end
|
73
|
+
|
74
|
+
it ".line_x0" do # x0 y0
|
75
|
+
expect(area.line_x0).to be_instance_of(D3::LineGenerator)
|
76
|
+
expect(area.line_x0.x.(point)).to eq(420)
|
77
|
+
expect(area.line_x0.y.(point)).to eq(50)
|
78
|
+
end
|
79
|
+
|
80
|
+
it ".line_x1" do # x1 y0
|
81
|
+
expect(area.line_x1).to be_instance_of(D3::LineGenerator)
|
82
|
+
expect(area.line_x1.x.(point)).to eq(840)
|
83
|
+
expect(area.line_x1.y.(point)).to eq(50)
|
84
|
+
end
|
85
|
+
|
86
|
+
it ".line_y0" do # x0 y0
|
87
|
+
expect(area.line_y0).to be_instance_of(D3::LineGenerator)
|
88
|
+
expect(area.line_y0.x.(point)).to eq(420)
|
89
|
+
expect(area.line_y0.y.(point)).to eq(50)
|
90
|
+
end
|
91
|
+
|
92
|
+
it ".line_y1" do # x0 y1
|
93
|
+
expect(area.line_y1).to be_instance_of(D3::LineGenerator)
|
94
|
+
expect(area.line_y1.x.(point)).to eq(420)
|
95
|
+
expect(area.line_y1.y.(point)).to eq(117)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
data/spec/axis_spec.rb
ADDED
@@ -0,0 +1,174 @@
|
|
1
|
+
describe "d3 - axis" do
|
2
|
+
after(:each) do
|
3
|
+
D3.select("#test-area").html("")
|
4
|
+
end
|
5
|
+
|
6
|
+
let(:scale) { D3.scale_linear.domain([0,80_000_000]).range([0,800]) }
|
7
|
+
let(:scale2) { D3.scale_linear.domain([0,30]).range([0,600]) }
|
8
|
+
let(:axis) { D3.axis_top(scale) }
|
9
|
+
|
10
|
+
it "d3.axis_top" do
|
11
|
+
expect(D3.axis_top(scale)).to be_instance_of(D3::Axis)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "d3.axis_bottom" do
|
15
|
+
expect(D3.axis_bottom(scale)).to be_instance_of(D3::Axis)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "d3.axis_right" do
|
19
|
+
expect(D3.axis_right(scale)).to be_instance_of(D3::Axis)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "d3.axis_left" do
|
23
|
+
expect(D3.axis_left(scale)).to be_instance_of(D3::Axis)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "axis.scale" do
|
27
|
+
expect(axis.scale).to eq(scale)
|
28
|
+
axis.scale(scale2)
|
29
|
+
expect(axis.scale).to eq(scale2)
|
30
|
+
axis.scale = scale
|
31
|
+
expect(axis.scale).to eq(scale)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "axis.tick_size_inner" do
|
35
|
+
expect(axis.tick_size_inner).to eq(6)
|
36
|
+
axis.tick_size_inner(20)
|
37
|
+
expect(axis.tick_size_inner).to eq(20)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "axis.tick_size_outer" do
|
41
|
+
expect(axis.tick_size_outer).to eq(6)
|
42
|
+
axis.tick_size_outer(20)
|
43
|
+
expect(axis.tick_size_outer).to eq(20)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "axis.tick_size" do
|
47
|
+
expect(axis.tick_size).to eq(6)
|
48
|
+
axis.tick_size(20)
|
49
|
+
expect(axis.tick_size).to eq(20)
|
50
|
+
end
|
51
|
+
|
52
|
+
it "axis.tick_padding" do
|
53
|
+
expect(axis.tick_padding).to eq(3)
|
54
|
+
axis.tick_padding(10)
|
55
|
+
expect(axis.tick_padding).to eq(10)
|
56
|
+
end
|
57
|
+
|
58
|
+
describe "axis.tick_values" do
|
59
|
+
it "defaults" do
|
60
|
+
context = D3.select("#test-area").append("svg")
|
61
|
+
expect(axis.tick_values).to eq(nil)
|
62
|
+
axis.(context)
|
63
|
+
expect(D3.select("#test-area").html).to eq([
|
64
|
+
'<svg fill="none" font-size="10" font-family="sans-serif" text-anchor="middle">',
|
65
|
+
'<path class="domain" stroke="#000" d="M0.5,-6V0.5H800.5V-6"></path>',
|
66
|
+
'<g class="tick" opacity="1" transform="translate(0.5,0)"><line stroke="#000" y2="-6"></line><text fill="#000" y="-9" dy="0em">0</text></g>',
|
67
|
+
'<g class="tick" opacity="1" transform="translate(100.5,0)"><line stroke="#000" y2="-6"></line><text fill="#000" y="-9" dy="0em">10,000,000</text></g>',
|
68
|
+
'<g class="tick" opacity="1" transform="translate(200.5,0)"><line stroke="#000" y2="-6"></line><text fill="#000" y="-9" dy="0em">20,000,000</text></g>',
|
69
|
+
'<g class="tick" opacity="1" transform="translate(300.5,0)"><line stroke="#000" y2="-6"></line><text fill="#000" y="-9" dy="0em">30,000,000</text></g>',
|
70
|
+
'<g class="tick" opacity="1" transform="translate(400.5,0)"><line stroke="#000" y2="-6"></line><text fill="#000" y="-9" dy="0em">40,000,000</text></g>',
|
71
|
+
'<g class="tick" opacity="1" transform="translate(500.5,0)"><line stroke="#000" y2="-6"></line><text fill="#000" y="-9" dy="0em">50,000,000</text></g>',
|
72
|
+
'<g class="tick" opacity="1" transform="translate(600.5,0)"><line stroke="#000" y2="-6"></line><text fill="#000" y="-9" dy="0em">60,000,000</text></g>',
|
73
|
+
'<g class="tick" opacity="1" transform="translate(700.5,0)"><line stroke="#000" y2="-6"></line><text fill="#000" y="-9" dy="0em">70,000,000</text></g>',
|
74
|
+
'<g class="tick" opacity="1" transform="translate(800.5,0)"><line stroke="#000" y2="-6"></line><text fill="#000" y="-9" dy="0em">80,000,000</text></g>',
|
75
|
+
'</svg>',
|
76
|
+
].join)
|
77
|
+
end
|
78
|
+
|
79
|
+
it "set/get" do
|
80
|
+
context = D3.select("#test-area").append("svg")
|
81
|
+
axis.tick_values = [0, 20_000_000, 40_000_000]
|
82
|
+
expect(axis.tick_values).to eq([0, 20_000_000, 40_000_000])
|
83
|
+
axis.(context)
|
84
|
+
expect(D3.select("#test-area").html).to eq([
|
85
|
+
'<svg fill="none" font-size="10" font-family="sans-serif" text-anchor="middle">',
|
86
|
+
'<path class="domain" stroke="#000" d="M0.5,-6V0.5H800.5V-6"></path>',
|
87
|
+
'<g class="tick" opacity="1" transform="translate(0.5,0)"><line stroke="#000" y2="-6"></line><text fill="#000" y="-9" dy="0em">0</text></g>',
|
88
|
+
'<g class="tick" opacity="1" transform="translate(200.5,0)"><line stroke="#000" y2="-6"></line><text fill="#000" y="-9" dy="0em">20,000,000</text></g>',
|
89
|
+
'<g class="tick" opacity="1" transform="translate(400.5,0)"><line stroke="#000" y2="-6"></line><text fill="#000" y="-9" dy="0em">40,000,000</text></g>',
|
90
|
+
'</svg>',
|
91
|
+
].join)
|
92
|
+
axis.tick_values(nil)
|
93
|
+
expect(axis.tick_values).to eq(nil)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
describe "axis.tick_format" do
|
98
|
+
let(:scale) { D3.scale_linear.domain([0,80_000]).range([0,800]) }
|
99
|
+
it "basics" do
|
100
|
+
context = D3.select("#test-area").append("svg")
|
101
|
+
expect(axis.tick_format).to eq(nil)
|
102
|
+
axis.tick_values = [0, 20_000, 40_000]
|
103
|
+
axis.tick_format = D3.format(",.2f")
|
104
|
+
axis.(context)
|
105
|
+
expect(D3.select("#test-area").html).to eq([
|
106
|
+
'<svg fill="none" font-size="10" font-family="sans-serif" text-anchor="middle">',
|
107
|
+
'<path class="domain" stroke="#000" d="M0.5,-6V0.5H800.5V-6"></path>',
|
108
|
+
'<g class="tick" opacity="1" transform="translate(0.5,0)"><line stroke="#000" y2="-6"></line><text fill="#000" y="-9" dy="0em">0.00</text></g>',
|
109
|
+
'<g class="tick" opacity="1" transform="translate(200.5,0)"><line stroke="#000" y2="-6"></line><text fill="#000" y="-9" dy="0em">20,000.00</text></g>',
|
110
|
+
'<g class="tick" opacity="1" transform="translate(400.5,0)"><line stroke="#000" y2="-6"></line><text fill="#000" y="-9" dy="0em">40,000.00</text></g>',
|
111
|
+
'</svg>',
|
112
|
+
].join)
|
113
|
+
end
|
114
|
+
|
115
|
+
it "block" do
|
116
|
+
context = D3.select("#test-area").append("svg")
|
117
|
+
expect(axis.tick_format).to eq(nil)
|
118
|
+
axis.tick_values = [0, 20_000, 40_000]
|
119
|
+
axis.tick_format{|d| "#{d}x"}
|
120
|
+
expect(axis.tick_format.(5)).to eq("5x")
|
121
|
+
axis.(context)
|
122
|
+
expect(D3.select("#test-area").html).to eq([
|
123
|
+
'<svg fill="none" font-size="10" font-family="sans-serif" text-anchor="middle">',
|
124
|
+
'<path class="domain" stroke="#000" d="M0.5,-6V0.5H800.5V-6"></path>',
|
125
|
+
'<g class="tick" opacity="1" transform="translate(0.5,0)"><line stroke="#000" y2="-6"></line><text fill="#000" y="-9" dy="0em">0x</text></g>',
|
126
|
+
'<g class="tick" opacity="1" transform="translate(200.5,0)"><line stroke="#000" y2="-6"></line><text fill="#000" y="-9" dy="0em">20000x</text></g>',
|
127
|
+
'<g class="tick" opacity="1" transform="translate(400.5,0)"><line stroke="#000" y2="-6"></line><text fill="#000" y="-9" dy="0em">40000x</text></g>',
|
128
|
+
'</svg>',
|
129
|
+
].join)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
it "axis.ticks" do
|
134
|
+
context = D3.select("#test-area").append("svg")
|
135
|
+
axis.ticks(10, ".2f")
|
136
|
+
axis.(context)
|
137
|
+
expect(D3.select("#test-area").html).to eq([
|
138
|
+
'<svg fill="none" font-size="10" font-family="sans-serif" text-anchor="middle">',
|
139
|
+
'<path class="domain" stroke="#000" d="M0.5,-6V0.5H800.5V-6"></path>',
|
140
|
+
'<g class="tick" opacity="1" transform="translate(0.5,0)"><line stroke="#000" y2="-6"></line><text fill="#000" y="-9" dy="0em">0.00</text></g>',
|
141
|
+
'<g class="tick" opacity="1" transform="translate(100.5,0)"><line stroke="#000" y2="-6"></line><text fill="#000" y="-9" dy="0em">10000000.00</text></g>',
|
142
|
+
'<g class="tick" opacity="1" transform="translate(200.5,0)"><line stroke="#000" y2="-6"></line><text fill="#000" y="-9" dy="0em">20000000.00</text></g>',
|
143
|
+
'<g class="tick" opacity="1" transform="translate(300.5,0)"><line stroke="#000" y2="-6"></line><text fill="#000" y="-9" dy="0em">30000000.00</text></g>',
|
144
|
+
'<g class="tick" opacity="1" transform="translate(400.5,0)"><line stroke="#000" y2="-6"></line><text fill="#000" y="-9" dy="0em">40000000.00</text></g>',
|
145
|
+
'<g class="tick" opacity="1" transform="translate(500.5,0)"><line stroke="#000" y2="-6"></line><text fill="#000" y="-9" dy="0em">50000000.00</text></g>',
|
146
|
+
'<g class="tick" opacity="1" transform="translate(600.5,0)"><line stroke="#000" y2="-6"></line><text fill="#000" y="-9" dy="0em">60000000.00</text></g>',
|
147
|
+
'<g class="tick" opacity="1" transform="translate(700.5,0)"><line stroke="#000" y2="-6"></line><text fill="#000" y="-9" dy="0em">70000000.00</text></g>',
|
148
|
+
'<g class="tick" opacity="1" transform="translate(800.5,0)"><line stroke="#000" y2="-6"></line><text fill="#000" y="-9" dy="0em">80000000.00</text></g>',
|
149
|
+
'</svg>',
|
150
|
+
].join)
|
151
|
+
end
|
152
|
+
|
153
|
+
it "axis.tick_arguments" do
|
154
|
+
context = D3.select("#test-area").append("svg")
|
155
|
+
expect(axis.tick_arguments).to eq([])
|
156
|
+
axis.tick_arguments([10, ".2f"])
|
157
|
+
expect(axis.tick_arguments).to eq([10, ".2f"])
|
158
|
+
axis.(context)
|
159
|
+
expect(D3.select("#test-area").html).to eq([
|
160
|
+
'<svg fill="none" font-size="10" font-family="sans-serif" text-anchor="middle">',
|
161
|
+
'<path class="domain" stroke="#000" d="M0.5,-6V0.5H800.5V-6"></path>',
|
162
|
+
'<g class="tick" opacity="1" transform="translate(0.5,0)"><line stroke="#000" y2="-6"></line><text fill="#000" y="-9" dy="0em">0.00</text></g>',
|
163
|
+
'<g class="tick" opacity="1" transform="translate(100.5,0)"><line stroke="#000" y2="-6"></line><text fill="#000" y="-9" dy="0em">10000000.00</text></g>',
|
164
|
+
'<g class="tick" opacity="1" transform="translate(200.5,0)"><line stroke="#000" y2="-6"></line><text fill="#000" y="-9" dy="0em">20000000.00</text></g>',
|
165
|
+
'<g class="tick" opacity="1" transform="translate(300.5,0)"><line stroke="#000" y2="-6"></line><text fill="#000" y="-9" dy="0em">30000000.00</text></g>',
|
166
|
+
'<g class="tick" opacity="1" transform="translate(400.5,0)"><line stroke="#000" y2="-6"></line><text fill="#000" y="-9" dy="0em">40000000.00</text></g>',
|
167
|
+
'<g class="tick" opacity="1" transform="translate(500.5,0)"><line stroke="#000" y2="-6"></line><text fill="#000" y="-9" dy="0em">50000000.00</text></g>',
|
168
|
+
'<g class="tick" opacity="1" transform="translate(600.5,0)"><line stroke="#000" y2="-6"></line><text fill="#000" y="-9" dy="0em">60000000.00</text></g>',
|
169
|
+
'<g class="tick" opacity="1" transform="translate(700.5,0)"><line stroke="#000" y2="-6"></line><text fill="#000" y="-9" dy="0em">70000000.00</text></g>',
|
170
|
+
'<g class="tick" opacity="1" transform="translate(800.5,0)"><line stroke="#000" y2="-6"></line><text fill="#000" y="-9" dy="0em">80000000.00</text></g>',
|
171
|
+
'</svg>',
|
172
|
+
].join)
|
173
|
+
end
|
174
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
describe "d3 - band scale" do
|
2
|
+
it "d3.scale_band" do
|
3
|
+
expect(D3.scale_band).to be_instance_of(D3::BandScale)
|
4
|
+
end
|
5
|
+
|
6
|
+
let(:d) { ("a".."f").to_a }
|
7
|
+
it "basics" do
|
8
|
+
scale = D3.scale_band.domain(d)
|
9
|
+
expect(d.map{|v| scale.(v).round(2)}).to eq([0, 0.17, 0.33, 0.5, 0.67, 0.83])
|
10
|
+
expect(scale.bandwidth).to eq(0.16666666666666666)
|
11
|
+
expect(scale.step).to eq(0.16666666666666666)
|
12
|
+
expect(scale.("z")).to eq(nil)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "padding" do
|
16
|
+
scale = D3.scale_band.domain(d).range([0,100])
|
17
|
+
expect(scale.padding).to eq(0)
|
18
|
+
expect(scale.padding_inner).to eq(0)
|
19
|
+
expect(scale.padding_outer).to eq(0)
|
20
|
+
|
21
|
+
scale.padding(0.5)
|
22
|
+
expect(scale.padding).to eq(0.5)
|
23
|
+
expect(scale.padding_inner).to eq(0.5)
|
24
|
+
expect(scale.padding_outer).to eq(0.5)
|
25
|
+
|
26
|
+
scale.padding_inner(0.2)
|
27
|
+
scale.padding_outer(0.4)
|
28
|
+
expect(scale.padding).to eq(0.2)
|
29
|
+
expect(scale.padding_inner).to eq(0.2)
|
30
|
+
expect(scale.padding_outer).to eq(0.4)
|
31
|
+
|
32
|
+
expect(d.map{|v| scale.(v).round(2)}).to eq([6.06, 21.21, 36.36, 51.52, 66.67, 81.82])
|
33
|
+
expect(scale.bandwidth).to eq(12.121212121212123)
|
34
|
+
expect(scale.step).to eq(15.151515151515152)
|
35
|
+
end
|
36
|
+
|
37
|
+
it "copy" do
|
38
|
+
scale = D3.scale_band.domain(d)
|
39
|
+
sc = scale.copy.range([10,20])
|
40
|
+
expect(scale.domain).to eq(d)
|
41
|
+
expect(sc.domain).to eq(d)
|
42
|
+
expect(scale.range).to eq([0,1])
|
43
|
+
expect(sc.range).to eq([10,20])
|
44
|
+
end
|
45
|
+
|
46
|
+
it "align" do
|
47
|
+
scale = D3.scale_band.domain(d).range([0,100])
|
48
|
+
expect(scale.align).to eq(0.5)
|
49
|
+
scale.padding_inner(0.2)
|
50
|
+
scale.padding_outer(0.4)
|
51
|
+
expect(d.map{|v| scale.(v).round(2)}).to eq([6.06, 21.21, 36.36, 51.52, 66.67, 81.82])
|
52
|
+
|
53
|
+
scale.align(0)
|
54
|
+
expect(scale.align).to eq(0)
|
55
|
+
expect(d.map{|v| scale.(v).round(2)}).to eq([0, 15.15, 30.3, 45.45, 60.61, 75.76])
|
56
|
+
|
57
|
+
scale.align(1)
|
58
|
+
expect(scale.align).to eq(1)
|
59
|
+
expect(d.map{|v| scale.(v).round(2)}).to eq([12.12, 27.27, 42.42, 57.58, 72.73, 87.88])
|
60
|
+
expect(scale.bandwidth).to eq(12.121212121212123)
|
61
|
+
expect(scale.step).to eq(15.151515151515152)
|
62
|
+
end
|
63
|
+
|
64
|
+
it "round" do
|
65
|
+
scale = D3.scale_band.domain(d).range([0,100])
|
66
|
+
expect(scale.round).to eq(false)
|
67
|
+
scale.range_round([0,1000])
|
68
|
+
expect(scale.range).to eq([0,1000])
|
69
|
+
expect(scale.round).to eq(true)
|
70
|
+
# This rounding is somewhat weird
|
71
|
+
expect(d.map{|v| scale.(v)}).to eq([2, 168, 334, 500, 666, 832])
|
72
|
+
end
|
73
|
+
end
|
data/spec/color_spec.rb
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
describe "d3-colors" do
|
2
|
+
it "d3.color" do
|
3
|
+
expect(D3.color("blue")).to be_instance_of(D3::Color)
|
4
|
+
end
|
5
|
+
|
6
|
+
it "supported syntax" do
|
7
|
+
expect(D3.color("rgb(255, 255, 255)").to_s).to eq("rgb(255, 255, 255)")
|
8
|
+
expect(D3.color("rgb(10%, 20%, 30%)").to_s).to eq("rgb(26, 51, 77)")
|
9
|
+
expect(D3.color("rgba(255, 255, 255, 0.4)").to_s).to eq("rgba(255, 255, 255, 0.4)")
|
10
|
+
expect(D3.color("rgba(10%, 20%, 30%, 0.4)").to_s).to eq("rgba(26, 51, 77, 0.4)")
|
11
|
+
expect(D3.color("hsl(120, 50%, 20%)").to_s).to eq("rgb(25, 77, 25)")
|
12
|
+
expect(D3.color("hsla(120, 50%, 20%, 0.4)").to_s).to eq("rgba(25, 77, 25, 0.4)")
|
13
|
+
expect(D3.color("#ffeeaa").to_s).to eq("rgb(255, 238, 170)")
|
14
|
+
expect(D3.color("#fea").to_s).to eq("rgb(255, 238, 170)")
|
15
|
+
expect(D3.color("steelblue").to_s).to eq("rgb(70, 130, 180)")
|
16
|
+
end
|
17
|
+
|
18
|
+
it "invalid colors" do
|
19
|
+
expect{ D3.color("poop_emoji") }.to raise_error(/Invalid color/)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "color.brighter" do
|
23
|
+
steelblue = D3.color("steelblue")
|
24
|
+
expect(steelblue.brighter.to_s).to eq("rgb(100, 186, 255)")
|
25
|
+
expect(steelblue.brighter(0.25).to_s).to eq("rgb(77, 142, 197)")
|
26
|
+
end
|
27
|
+
|
28
|
+
it "color.darker" do
|
29
|
+
steelblue = D3.color("steelblue")
|
30
|
+
expect(steelblue.darker.to_s).to eq("rgb(49, 91, 126)")
|
31
|
+
expect(steelblue.darker(0.25).to_s).to eq("rgb(64, 119, 165)")
|
32
|
+
end
|
33
|
+
|
34
|
+
it "color.displayable?" do
|
35
|
+
expect(D3.color("rgb(255,255,255)")).to be_displayable
|
36
|
+
expect(D3.color("rgb(260,260,260)")).to_not be_displayable
|
37
|
+
end
|
38
|
+
|
39
|
+
it "d3.rgb" do
|
40
|
+
steelblue = D3.rgb("steelblue")
|
41
|
+
expect([steelblue.r, steelblue.g, steelblue.b]).to eq([70, 130, 180])
|
42
|
+
expect(D3.rgb(10,20,30).to_s).to eq("rgb(10, 20, 30)")
|
43
|
+
expect(D3.rgb(10,20,30,0.5).to_s).to eq("rgba(10, 20, 30, 0.5)")
|
44
|
+
expect(D3.rgb(D3.hsl("steelblue")).to_s).to eq("rgb(70, 130, 180)")
|
45
|
+
end
|
46
|
+
|
47
|
+
it "d3.hsl" do
|
48
|
+
steelblue = D3.hsl("steelblue")
|
49
|
+
expect([steelblue.h, steelblue.s, steelblue.l]).to eq([207.27272727272728, 0.44, 0.4901960784313726])
|
50
|
+
expect(D3.hsl(207.27272727272728, 0.44, 0.4901960784313726).to_s).to eq("rgb(70, 130, 180)")
|
51
|
+
expect(D3.hsl(207.27272727272728, 0.44, 0.4901960784313726, 0.5).to_s).to eq("rgba(70, 130, 180, 0.5)")
|
52
|
+
end
|
53
|
+
|
54
|
+
it "d3.lab" do
|
55
|
+
steelblue = D3.lab("steelblue")
|
56
|
+
expect([steelblue.l, steelblue.a, steelblue.b]).to eq([52.46551718768575, -4.0774710123572255, -32.19186122981343])
|
57
|
+
expect(D3.lab(52.46551718768575, -4.0774710123572255, -32.19186122981343).to_s).to eq("rgb(70, 130, 180)")
|
58
|
+
expect(D3.lab(52.46551718768575, -4.0774710123572255, -32.19186122981343, 0.5).to_s).to eq("rgba(70, 130, 180, 0.5)")
|
59
|
+
end
|
60
|
+
|
61
|
+
it "d3.hcl" do
|
62
|
+
steelblue = D3.hcl("steelblue")
|
63
|
+
expect([steelblue.h, steelblue.c, steelblue.l]).to eq([262.78126775909277, 32.44906314974561, 52.46551718768575])
|
64
|
+
expect(D3.hcl(262.78126775909277, 32.44906314974561, 52.46551718768575).to_s).to eq("rgb(70, 130, 180)")
|
65
|
+
expect(D3.hcl(262.78126775909277, 32.44906314974561, 52.46551718768575, 0.5).to_s).to eq("rgba(70, 130, 180, 0.5)")
|
66
|
+
end
|
67
|
+
|
68
|
+
it "d3.cubehelix" do
|
69
|
+
steelblue = D3.cubehelix("steelblue")
|
70
|
+
expect([steelblue.h, steelblue.s, steelblue.l]).to eq([202.84837896488932, 0.6273147230777709, 0.460784355920337])
|
71
|
+
expect(D3.cubehelix(202.84837896488932, 0.6273147230777709, 0.460784355920337).to_s).to eq("rgb(70, 130, 180)")
|
72
|
+
expect(D3.cubehelix(202.84837896488932, 0.6273147230777709, 0.460784355920337, 0.5).to_s).to eq("rgba(70, 130, 180, 0.5)")
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,217 @@
|
|
1
|
+
require "time"
|
2
|
+
|
3
|
+
describe "d3 - continuous scale" do
|
4
|
+
describe "linear" do
|
5
|
+
it "d3.scale_linear" do
|
6
|
+
expect(D3.scale_linear).to be_instance_of(D3::ContinuousScale)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "basics" do
|
10
|
+
x = D3.scale_linear.domain([10, 130]).range([0, 960])
|
11
|
+
expect(x.domain).to eq([10, 130])
|
12
|
+
expect(x.range).to eq([0, 960])
|
13
|
+
expect(x.(20)).to eq(80)
|
14
|
+
expect(x.(50)).to eq(320)
|
15
|
+
expect(x.(-10)).to eq(-160)
|
16
|
+
expect(x.invert(-160)).to eq(-10)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "range_round" do
|
20
|
+
x = D3.scale_linear.domain([0,6]).range([0, 100])
|
21
|
+
y = D3.scale_linear.domain([0,6]).range_round([0, 100])
|
22
|
+
expect(x.(4)).to eq(66.66666666666666)
|
23
|
+
expect(y.(4)).to eq(67)
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "interpolate" do
|
27
|
+
let(:x) { D3.scale_linear.domain([0,6]).range([0, 100]) }
|
28
|
+
let(:xf) { x.copy.interpolate{|a,b| proc{|t| (a + (b-a)*t).floor }}}
|
29
|
+
let(:xc) { x.copy.interpolate{|a,b| proc{|t| (a + (b-a)*t).ceil }}}
|
30
|
+
let(:xr) { x.copy.interpolate(&D3.interpolate_round) }
|
31
|
+
it "floor" do
|
32
|
+
expect(xf.(4)).to eq(66)
|
33
|
+
end
|
34
|
+
it "ceil" do
|
35
|
+
expect(xc.(4)).to eq(67)
|
36
|
+
end
|
37
|
+
it "round" do
|
38
|
+
expect(xr.(4)).to eq(67)
|
39
|
+
end
|
40
|
+
it "get interpolator" do
|
41
|
+
expect(x.interpolate.(0,10).(0.34)).to eq(3.4000000000000004)
|
42
|
+
expect(xr.interpolate.(0,10).(0.34)).to eq(3)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
it ".clamp" do
|
47
|
+
x = D3.scale_linear.domain([10, 130]).range([0, 960])
|
48
|
+
expect(x.clamp).to eq(false)
|
49
|
+
x.clamp(true)
|
50
|
+
expect(x.clamp).to eq(true)
|
51
|
+
expect(x.(-10)).to eq(0)
|
52
|
+
expect(x.invert(-160)).to eq(10)
|
53
|
+
end
|
54
|
+
|
55
|
+
it ".nice / .copy" do
|
56
|
+
x = D3.scale_linear.domain([7, 127]).range([3, 955])
|
57
|
+
xn = x.copy.nice
|
58
|
+
expect(xn.domain).to eq([0, 130])
|
59
|
+
expect(xn.range).to eq([3, 955])
|
60
|
+
|
61
|
+
xc = x.copy
|
62
|
+
x5 = x.nice(5)
|
63
|
+
expect(x5.domain).to eq([0, 140])
|
64
|
+
expect(x5.range).to eq([3, 955])
|
65
|
+
expect(xc.domain).to eq([7, 127])
|
66
|
+
expect(xc.range).to eq([3, 955])
|
67
|
+
expect(x.domain).to eq(x5.domain)
|
68
|
+
expect(x.range).to eq(x5.range)
|
69
|
+
end
|
70
|
+
|
71
|
+
it "color" do
|
72
|
+
color = D3.scale_linear.domain([10, 100]).range(["brown", "steelblue"])
|
73
|
+
expect(color.(20)).to eq("rgb(154, 52, 57)")
|
74
|
+
expect(color.(50)).to eq("rgb(123, 81, 103)")
|
75
|
+
end
|
76
|
+
|
77
|
+
it "color piecewise" do
|
78
|
+
color = D3.scale_linear.domain([-1, 0, 1]).range(["red", "white", "green"])
|
79
|
+
expect(color.(-1)).to eq("rgb(255, 0, 0)")
|
80
|
+
expect(color.(-0.5)).to eq("rgb(255, 128, 128)")
|
81
|
+
expect(color.(0)).to eq("rgb(255, 255, 255)")
|
82
|
+
expect(color.(+0.5)).to eq("rgb(128, 192, 128)")
|
83
|
+
expect(color.(1)).to eq("rgb(0, 128, 0)")
|
84
|
+
end
|
85
|
+
|
86
|
+
it ".ticks / .tick_format" do
|
87
|
+
x = D3.scale_linear.domain([-1, 1]).range([0, 960])
|
88
|
+
expect(x.ticks(5)).to eq([-1, -0.5, 0, 0.5, 1])
|
89
|
+
expect(x.ticks.map{|v| v.round(2)}).to eq([-1, -0.8, -0.6, -0.4, -0.2, 0, 0.2, 0.4, 0.6, 0.8, 1])
|
90
|
+
tick_format = x.tick_format(5, "+%")
|
91
|
+
expect(x.ticks(5).map(&tick_format)).to eq(["-100%", "-50%", "+0%", "+50%", "+100%"])
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
describe "pow" do
|
96
|
+
it "d3.scale_pow" do
|
97
|
+
expect(D3.scale_pow).to be_instance_of(D3::PowScale)
|
98
|
+
expect(D3.scale_pow.exponent).to eq(1)
|
99
|
+
end
|
100
|
+
|
101
|
+
it "basics" do
|
102
|
+
x = D3.scale_pow.exponent(2).domain([0, 10]).range([0, 10000])
|
103
|
+
expect(x.(5)).to eq(2500)
|
104
|
+
expect(x.invert(4900)).to eq(7)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
describe "sqrt" do
|
109
|
+
it "d3.scale_sqrt" do
|
110
|
+
expect(D3.scale_sqrt).to be_instance_of(D3::PowScale)
|
111
|
+
expect(D3.scale_sqrt.exponent).to eq(0.5)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
describe "log" do
|
116
|
+
it 'd3.scale_log' do
|
117
|
+
expect(D3.scale_log).to be_instance_of(D3::LogScale)
|
118
|
+
expect(D3.scale_log.base).to eq(10)
|
119
|
+
end
|
120
|
+
|
121
|
+
it "basics" do
|
122
|
+
x = D3.scale_log.base(2).domain([1, 1024]).range([0, 100])
|
123
|
+
expect(x.(256)).to eq(80)
|
124
|
+
expect(x.invert(50)).to eq(32)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
describe "identity" do
|
129
|
+
it 'd3.scale_log' do
|
130
|
+
expect(D3.scale_identity).to be_instance_of(D3::ContinuousScale)
|
131
|
+
end
|
132
|
+
|
133
|
+
it "basics" do
|
134
|
+
x = D3.scale_identity.domain([10,20])
|
135
|
+
expect(x.(16)).to eq(16)
|
136
|
+
expect(x.invert(12)).to eq(12)
|
137
|
+
expect(x.domain).to eq([10,20])
|
138
|
+
expect(x.range).to eq([10,20])
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
# Sadly this can't be tested totally properly due to ridiculous mess
|
143
|
+
# javascript timezone management is
|
144
|
+
describe "time" do
|
145
|
+
let(:x) { D3.scale_time.domain([Time.parse("Jan 01 1990 00:00:00"), Time.parse(Time.parse("Jan 01 1998 00:00:00"))]).range([0,100]) }
|
146
|
+
let(:y) { D3.scale_utc.domain([Time.parse("Jan 01 1990 00:00:00"), Time.parse(Time.parse("Jan 01 1998 00:00:00"))]).range([0,100]) }
|
147
|
+
it "d3.scale_time" do
|
148
|
+
expect(D3.scale_time).to be_instance_of(D3::ContinuousScale)
|
149
|
+
end
|
150
|
+
|
151
|
+
it "d3.scale_utc" do
|
152
|
+
expect(D3.scale_utc).to be_instance_of(D3::ContinuousScale)
|
153
|
+
end
|
154
|
+
|
155
|
+
it "basics" do
|
156
|
+
expect(x.(Time.parse("Jul 01 1995 00:00:00")).round(1)).to eq(68.7)
|
157
|
+
end
|
158
|
+
|
159
|
+
it "invert" do
|
160
|
+
expect(x.invert(75).to_s).to eq("1996-01-01 12:00:00 -0000")
|
161
|
+
end
|
162
|
+
|
163
|
+
it "ticks" do
|
164
|
+
expect(x.ticks(4).map(&:to_s)).to eq([
|
165
|
+
"1990-01-01 00:00:00 -0000",
|
166
|
+
"1992-01-01 00:00:00 -0000",
|
167
|
+
"1994-01-01 00:00:00 -0000",
|
168
|
+
"1996-01-01 00:00:00 -0000",
|
169
|
+
"1998-01-01 00:00:00 -0000",
|
170
|
+
])
|
171
|
+
end
|
172
|
+
|
173
|
+
it "ticks interval" do
|
174
|
+
expect(x.ticks(D3.time_month.every(8)).map{|d| d.to_s.split[0]}).to eq([
|
175
|
+
"1990-01-01",
|
176
|
+
"1990-09-01",
|
177
|
+
"1991-01-01",
|
178
|
+
"1991-09-01",
|
179
|
+
"1992-01-01",
|
180
|
+
"1992-09-01",
|
181
|
+
"1993-01-01",
|
182
|
+
"1993-09-01",
|
183
|
+
"1994-01-01",
|
184
|
+
"1994-09-01",
|
185
|
+
"1995-01-01",
|
186
|
+
"1995-09-01",
|
187
|
+
"1996-01-01",
|
188
|
+
"1996-09-01",
|
189
|
+
"1997-01-01",
|
190
|
+
"1997-09-01",
|
191
|
+
"1998-01-01",
|
192
|
+
])
|
193
|
+
end
|
194
|
+
|
195
|
+
it "utc ticks interval" do
|
196
|
+
expect(y.ticks(D3.utc_month.every(8)).map{|d| d.to_s.split[0]}).to eq([
|
197
|
+
"1990-01-01",
|
198
|
+
"1990-09-01",
|
199
|
+
"1991-01-01",
|
200
|
+
"1991-09-01",
|
201
|
+
"1992-01-01",
|
202
|
+
"1992-09-01",
|
203
|
+
"1993-01-01",
|
204
|
+
"1993-09-01",
|
205
|
+
"1994-01-01",
|
206
|
+
"1994-09-01",
|
207
|
+
"1995-01-01",
|
208
|
+
"1995-09-01",
|
209
|
+
"1996-01-01",
|
210
|
+
"1996-09-01",
|
211
|
+
"1997-01-01",
|
212
|
+
"1997-09-01",
|
213
|
+
"1998-01-01",
|
214
|
+
])
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|