require File.expand_path(File.dirname(__FILE__)+"/spec_helper.rb")
describe Rubyvis::Layout::Stack do
include Rubyvis::LayoutSpec
it "should have correct properties" do
props=[:antialias, :bottom, :canvas, :cursor, :data, :events, :fill_style, :height, :id, :layers, :left, :line_width, :offset, :order, :orient, :overflow, :reverse, :right, :stroke_style, :title, :top, :transform, :visible, :width].inject({}) {|ac, v| ac[v]=true; ac}
Rubyvis::Layout::Stack.properties.should==props
end
it "Rubyvis.Dot be the same as Rubyvis::Dot" do
Rubyvis.Layout.Stack.should eql Rubyvis::Layout::Stack
end
describe "html examples" do
before do
w = 300
@h = 300
n = 20 # // number of layers
m = 75 # // number of samples per layer
x = pv.Scale.linear(2, m - 1).range(0, w)
@y = pv.Scale.linear(0, 20).range(0, @h/2.0)
fill=pv.ramp("#ada", "#656").domain(n, 0)
@vis = Rubyvis::Panel.new()
.width(w)
.height(@h)
dat=waves(n,m)
@stack=@vis.add(Rubyvis::Layout::Stack)
.layers(dat)
.x(lambda {|d| x[self.index]})
.y(lambda {|d| d})
@stack.layer.add(Rubyvis::Area)
.fill_style(lambda {fill[self.parent.index]})
.stroke_style("#797")
end
it "should render 'stack-expand.html' example correctly" do
@stack.order("inside-out").
offset("expand")
@vis.render()
pv_out=fixture_svg_read("stack_expand.svg")
@vis.to_svg.should have_same_svg_elements(pv_out)
end
it "should render 'stack-silohouette.html' example correctly" do
y=@y
@stack.order("reverse").
offset("silohouette").
y(lambda {|d| y[d]})
@vis.render()
pv_out=fixture_svg_read("stack_silohouette.svg")
@vis.to_svg.should have_same_svg_elements(pv_out)
end
it "should render 'stack-wiggle.html' example correctly" do
y=@y
@stack.order("reverse").
offset("wiggle").
y(lambda {|d| y[d]})
@vis.render()
pv_out=fixture_svg_read("stack_wiggle.svg")
@vis.to_svg.should have_same_svg_elements(pv_out)
end
end
describe "rendered" do
before do
@h=200
@w=200
@x=Rubyvis::Scale.linear(0,3).range(0,@w)
@y=Rubyvis::Scale.linear(0,10).range(0,@h)
@vis = Rubyvis.Panel.new.width(@w).height(@h)
@stack=@vis.add(Rubyvis::Layout::Stack)
end
describe "only with layers()" do
before do
x=@x
y=@y
@data=[[1,3,2],[2,1,3]]
@stack.layers(@data).
x(lambda {|d| x.scale(index)}).
y(lambda {|d| y.scale(d)}).layer.add(Rubyvis::Area)
@vis.render
doc=Nokogiri::XML(@vis.to_svg)
@paths=doc.xpath("//xmlns:path")
#
end
it "should return correct number of areas" do
@paths.size.should eq 2
end
it "should return correct path 1" do
@paths[0].should have_path_data_close_to "M0 180L66.66666666666666 140L133.33333333333331 160L133.33333333333331 200L66.66666666666666 200L0 200Z"
end
it "should return correct path 2" do
@paths[1].should have_path_data_close_to "M0 140L66.66666666666666 120L133.33333333333331 100L133.33333333333331 160L66.66666666666666 140L0 180Z"
end
end
describe "using layers() and values()" do
before do
x=@x
y=@y
@data=[{:first=>1,:second=>2},{:first=>3,:second=>1},{:first=>2,:second=>3}]
@stack.layers([:first,:second]).
values(@data).
x(lambda {|d| x.scale(index)}).
y(lambda {|d,dd| y.scale(d[dd])}).layer.add(Rubyvis::Area)
@vis.render
doc=Nokogiri::XML(@vis.to_svg)
@paths=doc.xpath("//xmlns:path")
#
end
it "should return correct number of areas" do
@paths.size.should eq 2
end
it "should return correct path 1" do
@paths[0].should have_path_data_close_to "M0 180L66.66666666666666 140L133.33333333333331 160L133.33333333333331 200L66.66666666666666 200L0 200Z"
end
it "should return correct path 2" do
@paths[1].should have_path_data_close_to "M0 140L66.66666666666666 120L133.33333333333331 100L133.33333333333331 160L66.66666666666666 140L0 180Z"
end
end
end
end