require 'spec_helper' describe(RCAP::CAP_1_2::Area) do before(:each) do @area_builder = lambda do |area| area.area_desc = 'Area Description' area.altitude = 100 area.ceiling = 200 area.add_circle do |circle| circle.lattitude = 0 circle.longitude = 0 circle.radius = 100 end area.add_geocode do |geocode| geocode.name = 'name' geocode.value = 'value' end area.add_polygon.add_point do |point| point.lattitude = 1 point.longitude = 2 end end end context('on initialisation') do before(:each) do @area = RCAP::CAP_1_2::Area.new @original_area = RCAP::CAP_1_2::Area.new(&@area_builder) end # Atomic it('should not have a area_desc') { @area.area_desc.should(be_nil) } it('should not have a altitude') { @area.altitude.should(be_nil) } it('should not have a ceiling') { @area.ceiling.should(be_nil) } # Group it('should have an empty polygons') { @area.polygons.should(be_empty) } it('should have an empty circles') { @area.circles.should(be_empty) } it('should have an empty geocodes') { @area.geocodes.should(be_empty) } shared_examples_for('it can parse into a CAP 1.2 Area object') do it('should parse the area_desc correctly') do @area.area_desc.should == @original_area.area_desc end it('should parse the altitude correctly') do @area.altitude.should == @original_area.altitude end it('should parse the ceiling correctly') do @area.ceiling.should == @original_area.ceiling end it('should parse the circles correctly') do @area.circles.should == @original_area.circles end it('should parse the geocodes correctly') do @area.geocodes.should == @original_area.geocodes end it('should parse the polygons correctly') do @area.polygons.should == @original_area.polygons end end context('from XML') do before(:each) do @alert = RCAP::CAP_1_2::Alert.new @alert.add_info.add_area(&@area_builder) @xml_string = @alert.to_xml @xml_document = REXML::Document.new(@xml_string) @info_xml_element = RCAP.xpath_first(@xml_document.root, RCAP::CAP_1_2::Info::XPATH, RCAP::CAP_1_2::Alert::XMLNS) @area_xml_element = RCAP.xpath_first(@info_xml_element, RCAP::CAP_1_2::Area::XPATH, RCAP::CAP_1_2::Alert::XMLNS) @area = RCAP::CAP_1_2::Area.from_xml_element(@area_xml_element) end it_should_behave_like('it can parse into a CAP 1.2 Area object') end context('from YAML Data') do before(:each) do @area = RCAP::CAP_1_2::Area.from_yaml_data(YAML.load(@original_area.to_yaml)) end it_should_behave_like('it can parse into a CAP 1.2 Area object') end context('from a hash') do before(:each) do @area = RCAP::CAP_1_2::Area.from_h(@original_area.to_h) end it_should_behave_like('it can parse into a CAP 1.2 Area object') end end context('when exported') do before(:each) do @area = RCAP::CAP_1_2::Area.new(&@area_builder) end context('to a hash') do before(:each) do @area_hash = @area.to_h end it('should export the area description correctly') do @area_hash[RCAP::CAP_1_2::Area::AREA_DESC_KEY].should == @area.area_desc end it('should export the altitude correctly') do @area_hash[RCAP::CAP_1_2::Area::ALTITUDE_KEY].should == @area.altitude end it('should set the ceiling correctly') do @area_hash[RCAP::CAP_1_2::Area::CEILING_KEY].should == @area.ceiling end it('should export the circles correctly') do @area_hash[RCAP::CAP_1_2::Area::CIRCLES_KEY].should == @area.circles.map { |circle| circle.to_a } end it('should export the geocodes correctly') do @area_hash[RCAP::CAP_1_2::Area::GEOCODES_KEY].should == @area.geocodes.map { |geocode| geocode.to_h } end it('should export the polygons correctly') do @area_hash[RCAP::CAP_1_2::Area::POLYGONS_KEY].should == @area.polygons.map { |polygon| polygon.to_h } end end end context('is not valid if') do before(:each) do @area = RCAP::CAP_1_2::Area.new do |area| area.area_desc = 'Cape Town Metropole' end @area.should(be_valid) end it('does not have an area descrtiption (area_desc)') do @area.area_desc = nil @area.should_not(be_valid) end it('has a ceiling defined but no altitude') do @area.ceiling = 1 @area.altitude = nil @area.should_not(be_valid) end context('it contains circles and it') do before(:each) do @area.add_circle do |circle| circle.lattitude = 0 circle.longitude = 0 circle.radius = 1 end @area.should(be_valid) end it('has an invalid circle') do @area.circles.first.lattitude = nil @area.should_not(be_valid) end end context('it contains polygons and it') do before(:each) do @polygon = @area.add_polygon do |polygon| [0, 1, 2, 0].each do |coordinate| polygon.add_point do |point| point.lattitude = coordinate point.longitude = coordinate end end end @area.should(be_valid) end it('has an invalid polygon') do @polygon.points.first.lattitude = nil @area.should_not(be_valid) end end context('it contains geocodes and it') do before(:each) do @geocode = @area.add_geocode do |geocode| geocode.name = 'name' geocode.value = 'value' end @area.should(be_valid) end it('has an invalid geocode') do @geocode.name = nil @area.should_not(be_valid) end end end describe('instance methods') do before(:each) do @area = RCAP::CAP_1_2::Area.new end describe('#add_polygon') do before(:each) do @polygon = @area.add_polygon end it('should return a CAP 1.1 Polygon') do @polygon.class.should == RCAP::CAP_1_2::Polygon end it('should add a Polygon to the polygons attribute') do @area.polygons.size.should == 1 end end describe('#add_circle') do before(:each) do @circle = @area.add_circle do |circle| circle.lattitude = 1 circle.longitude = 1 circle.radius = 1 end end it('should return a CAP 1.1 Circle') do @circle.class.should == RCAP::CAP_1_2::Circle @circle.lattitude.should == 1 @circle.longitude.should == 1 @circle.radius.should == 1 end it('should add a circle to the circles attribute') do @area.circles.size.should == 1 end end describe('#add_geocode') do before(:each) do @geocode = @area.add_geocode do |geocode| geocode.name = 'Geocode' geocode.value = '123' end end it('should return a CAP 1.1 Geocode') do @geocode.class.should == RCAP::CAP_1_2::Geocode @geocode.name.should == 'Geocode' @geocode.value.should == '123' end it('should add a geocode to the geocodes attribute') do @area.geocodes.size.should == 1 end end end end