describe("Creating a map", function() { var basic_map, advanced_map, map_with_events, map_with_custom_controls; it("should throw an error if element is not defined", function() { expect(function() { new GMaps({}); }).toThrow(new Error('No element defined.')); }); describe("With basic options", function() { beforeEach(function() { basic_map = basic_map || new GMaps({ el : '#basic-map', lat: -12.0433, lng: -77.0283, zoom: 12 }); }); it("should create a GMaps object", function() { expect(basic_map).toBeDefined(); }); it("should have centered the map at the initial coordinates", function() { var lat = basic_map.getCenter().lat(); var lng = basic_map.getCenter().lng(); expect(lat).toEqual(-12.0433); expect(lng).toEqual(-77.0283); }); it("should have the correct zoom", function() { expect(basic_map.getZoom()).toEqual(12); }); }); describe("With advanced controls", function() { beforeEach(function() { advanced_map = advanced_map || new GMaps({ el : '#advanced-map', lat: -12.0433, lng: -77.0283, zoomControl : true, panControl : false, streetViewControl : false, mapTypeControl: false, overviewMapControl: false }); }); it("should show the defined controls", function() { expect(advanced_map.map.zoomControl).toBeTruthy(); expect(advanced_map.map.panControl).toBeFalsy(); expect(advanced_map.map.streetViewControl).toBeFalsy(); expect(advanced_map.map.mapTypeControl).toBeFalsy(); expect(advanced_map.map.overviewMapControl).toBeFalsy(); }); }); describe("With events", function() { var callbacks, current_zoom = 0, current_center = null; beforeEach(function() { callbacks = { onclick : function(e) { var lat = e.latLng.lat(); var lng = e.latLng.lng(); map_with_events.addMarker({ lat : lat, lng : lng, title : 'New Marker' }); }, onzoomchanged : function() { console.log('onzoomchanged'); current_zoom = this.getZoom(); }, oncenterchanged : function() { console.log('oncenterchanged'); current_center = this.getCenter(); } }; spyOn(callbacks, 'onclick').andCallThrough(); spyOn(callbacks, 'onzoomchanged').andCallThrough(); spyOn(callbacks, 'oncenterchanged').andCallThrough(); map_with_events = map_with_events || new GMaps({ el : '#map-with-events', lat : -12.0433, lng : -77.0283, click : callbacks.onclick, zoom_changed : callbacks.onzoomchanged, center_changed : callbacks.oncenterchanged }); }); it("should respond to zoom_changed event", function() { map_with_events.map.setZoom(16); expect(callbacks.onzoomchanged).toHaveBeenCalled(); expect(current_zoom).toEqual(16); }); it("should respond to center_changed event", function() { map_with_events.map.setCenter(new google.maps.LatLng(-12.0907, -77.0227)); // Fix for floating-point bug var lat = parseFloat(current_center.lat().toFixed(4)); var lng = parseFloat(current_center.lng().toFixed(4)); expect(callbacks.oncenterchanged).toHaveBeenCalled(); expect(lat).toEqual(-12.0907); expect(lng).toEqual(-77.0227); }); it("should respond to click event", function() { google.maps.event.trigger(map_with_events.map, 'click', { latLng : new google.maps.LatLng(-12.0433, -77.0283) }); expect(callbacks.onclick).toHaveBeenCalled(); expect(map_with_events.markers.length).toEqual(1); }); afterEach(function() { document.getElementById('map-with-events').innerHTML = ''; map_with_events = null; }); }); describe("With custom controls", function() { var callbacks, markers_in_map = 0; beforeEach(function() { callbacks = { onclick : function() { map_with_custom_controls.addMarker({ lat : map_with_custom_controls.getCenter().lat(), lng : map_with_custom_controls.getCenter().lng() }); } } spyOn(callbacks, 'onclick').andCallThrough(); map_with_custom_controls = new GMaps({ el : '#map-with-custom-controls', lat : -12.0433, lng : -77.0283 }); map_with_custom_controls.addControl({ position : 'top_right', content : 'Add marker at the center', style : { margin: '5px', padding: '1px 6px', border: 'solid 1px #717B87', background: '#fff' }, events : { click: callbacks.onclick } }); }); it("should add the control to the controls collection", function() { expect(map_with_custom_controls.controls.length).toEqual(1); }); it("should respond to click event attached to the custom control", function() { google.maps.event.trigger(map_with_custom_controls.controls[0], 'click'); expect(callbacks.onclick).toHaveBeenCalled(); expect(map_with_custom_controls.markers.length).toEqual(1); }); }); });