dojo.provide("tests.webmap.widget.ZoomControl");

dojo.require("doh.runner");
dojo.require("webmap.widget.ZoomControl");
dojo.require("tests.Util");

var div;
function doZoomControlSetup(){
	tests.Util.resetDom();
	div = document.createElement("div");
	document.body.appendChild(div);
}

doh.register("tests.webmap.widget.ZoomControl", 
	[	
		{
			name: "postCreate",
			widget: null,
			zoomArgs: [],
			callArgs: [],
			subscribeArgs: [],
			call: webmap.widget.ZoomControl.superclass.postCreate.call,
			subscribe: dojo.subscribe,
			setUp: function(){
				doZoomControlSetup();
				var _this = this;
				webmap.widget.ZoomControl.superclass.postCreate.call = function(arg) {
					_this.callArgs.push(arg);
				};
				dojo.subscribe = function(a0, a1, a2) {
					_this.subscribeArgs.push([a0, a1, a2]);
				};
				this.widget = new webmap.widget.ZoomControl({
					_setZoomLevel: function(arg) {
						_this.zoomArgs.push(arg);
					}
				}, div);
			},
			runTest: function(){
				tests.assertEqual(webmap.config.numberOfZoomLevels,
					 dojo.query("td .webmapZoomLevel").length);
				tests.assertEqual([{zoomLevel:webmap.config.defaultZoomLevel}], this.zoomArgs);
				tests.assertEqual([this.widget], this.callArgs);
				tests.assertEqual(1, this.subscribeArgs.length);
				tests.assertEqual(["webmap.MapManager.mapDataChanged", this.widget, "_setZoomLevel"], 
					this.subscribeArgs[0]);
			},
			tearDown: function() {
				this.widget.destroy();
				webmap.widget.ZoomControl.superclass.postCreate.call = this.call;
				dojo.subscribe = this.subscribe;
			}
		},
		{
			name: "_changeZoomLevel_setZoomLevel",
			setUp: function(){
				doZoomControlSetup();
			},
			runTest: function(){
				var c = new webmap.widget.ZoomControl({}, div);
				var zoomArgs = null;
				var zoomCount = 0;
				c.checkZoom = function(args){zoomArgs = args;zoomCount++;};
				var s = dojo.subscribe("webmap.widget.ZoomControl.zoomLevelChanged", c, "checkZoom");
				tests.assertEqual(webmap.config.defaultZoomLevel, c._zoomLevel);
				c._changeZoomLevel(2);
				tests.assertEqual(1, zoomCount);
				tests.assertEqual({zoomLevel:2}, zoomArgs);
				tests.assertEqual(2, c._zoomLevel);
				c._changeZoomLevel(6);
				tests.assertEqual({zoomLevel:6}, zoomArgs);
				tests.assertEqual(2, zoomCount);
				tests.assertEqual(6, c._zoomLevel);
				c._changeZoomLevel(-1);
				tests.assertEqual({zoomLevel:6}, zoomArgs);
				tests.assertEqual(2, zoomCount);
				tests.assertEqual(6, c._zoomLevel);
				c._changeZoomLevel(100);
				tests.assertEqual({zoomLevel:6}, zoomArgs);
				tests.assertEqual(2, zoomCount);
				tests.assertEqual(6, c._zoomLevel);
				window.undockedWin = "not null";
				c._changeZoomLevel(2);
				tests.assertEqual({zoomLevel:6}, zoomArgs);
				tests.assertEqual(2, zoomCount);
				tests.assertEqual(6, c._zoomLevel);
				window.undockedWin = null;
			}
		},
		{
			name: "_setZoomLevel",
			widget: null,
			isDormant: webmap.isDormant,
			numberOfZoomLevels: webmap.config.numberOfZoomLevels,
			assert: function(w, z){
				var a = dojo.query(w.domNode.tagName + "#" + w.domNode.id + " img#zoom" + z)[0];
				tests.assertEqual("webmapZoomLevel webmapZoomLevelActive", a.className);
				dojo.forEach(w.buttons, function(b){
					if (a != b)
						tests.assertEqual(-1, b.className.indexOf("webmapZoomLevelActive"));
				});
			},
			setUp: function(){
				doZoomControlSetup();
				webmap.isDormant = function(){return true;};
				this.widget = new webmap.widget.ZoomControl({_zoomLevel:2}, div);
				webmap.config.numberOfZoomLevels = 9;
			},
			runTest: function(){
				this.widget._setZoomLevel({zoomLevel:6});
				tests.assertEqual(2, this.widget._zoomLevel);
				webmap.isDormant = function(){return false;};
				this.widget._setZoomLevel({zoomLevel:4});
				tests.assertEqual(4, this.widget._zoomLevel);
				this.assert(this.widget, 4);
				this.widget._setZoomLevel({zoomLevel:-1});
				tests.assertEqual(4, this.widget._zoomLevel);
				this.assert(this.widget, 4);
				this.widget._setZoomLevel({zoomLevel:11});
				tests.assertEqual(4, this.widget._zoomLevel);
				this.assert(this.widget, 4);
				this.widget._setZoomLevel({zoomLevel:7});
				tests.assertEqual(7, this.widget._zoomLevel);
				this.assert(this.widget, 7);
			},
			tearDown: function(){
				webmap.isDormant = this.isDormant;
				webmap.config.numberOfZoomLevels = this.numberOfZoomLevels;
				this.widget.destroy();
			}
		},
		{
			name: "_doMouseOver",
			setUp: function(){
				doZoomControlSetup();
			},
			runTest: function(){
				var c = new webmap.widget.ZoomControl({}, div);
				c.startup();
				var addClassCalls = 0;
				var addClassArgs = null;
				c.dojoCallCounter = function(node, value){addClassCalls++; addClassArgs = [node, value];};
				var conn = dojo.connect(dojo, "addClass", c, "dojoCallCounter");
				var classesCalls = 0;
				var button = null;
				c._getHoverClass = function(b){classesCalls++; button = b; return "myHoverClass";};
				c._doMouseOver({target:dojo.query(".webmapZoomLevel")[0]});
				tests.assertEqual(1, addClassCalls);
				tests.assertEqual(1, classesCalls);
				tests.assertEqual([dojo.query(".webmapZoomLevel")[0], "myHoverClass"], addClassArgs);
				tests.assertEqual(dojo.query(".webmapZoomLevel")[0], button);
				c._doMouseOver({target:dojo.query(".webmapZoomLevel")[3]});
				tests.assertEqual(2, addClassCalls);
				tests.assertEqual(2, classesCalls);
				tests.assertEqual([dojo.query(".webmapZoomLevel")[3], "myHoverClass"], addClassArgs);
				tests.assertEqual(dojo.query(".webmapZoomLevel")[3], button);
				c._doMouseOver({target:dojo.query(".webmapZoomIn")[0]});
				tests.assertEqual(3, addClassCalls);
				tests.assertEqual(3, classesCalls);
				tests.assertEqual([dojo.query(".webmapZoomIn")[0], "myHoverClass"], addClassArgs);
				tests.assertEqual(dojo.query(".webmapZoomIn")[0], button);
				c._doMouseOver({target:dojo.query(".webmapZoomOut")[0]});
				tests.assertEqual(4, addClassCalls);
				tests.assertEqual(4, classesCalls);
				tests.assertEqual([dojo.query(".webmapZoomOut")[0], "myHoverClass"], addClassArgs);
				tests.assertEqual(dojo.query(".webmapZoomOut")[0], button);
				dojo.disconnect(conn);
				c.destroy();
			}
		},
		{
			name: "_doMouseOut",
			setUp: function(){
				doZoomControlSetup();
			},
			runTest: function(){
				var c = new webmap.widget.ZoomControl({}, div);
				c.startup();
				var removeClassCalls = 0;
				var removeClassArgs = null;
				c.dojoCallCounter = function(node, value){removeClassCalls++; removeClassArgs = [node, value];};
				var conn = dojo.connect(dojo, "removeClass", c, "dojoCallCounter");
				var classesCalls = 0;
				var button = null;
				c._getHoverClass = function(b){classesCalls++; button = b; return "myHoverClass";};
				c._doMouseOut({target:dojo.query(".webmapZoomLevel")[0]});
				tests.assertEqual(1, removeClassCalls);
				tests.assertEqual(1, classesCalls);
				tests.assertEqual([dojo.query(".webmapZoomLevel")[0], "myHoverClass"], removeClassArgs);
				tests.assertEqual(dojo.query(".webmapZoomLevel")[0], button);
				c._doMouseOut({target:dojo.query(".webmapZoomLevel")[3]});
				tests.assertEqual(2, removeClassCalls);
				tests.assertEqual(2, classesCalls);
				tests.assertEqual([dojo.query(".webmapZoomLevel")[3], "myHoverClass"], removeClassArgs);
				tests.assertEqual(dojo.query(".webmapZoomLevel")[3], button);
				c._doMouseOut({target:dojo.query(".webmapZoomIn")[0]});
				tests.assertEqual(3, removeClassCalls);
				tests.assertEqual(3, classesCalls);
				tests.assertEqual([dojo.query(".webmapZoomIn")[0], "myHoverClass"], removeClassArgs);
				tests.assertEqual(dojo.query(".webmapZoomIn")[0], button);
				c._doMouseOut({target:dojo.query(".webmapZoomOut")[0]});
				tests.assertEqual(4, removeClassCalls);
				tests.assertEqual(4, classesCalls);
				tests.assertEqual([dojo.query(".webmapZoomOut")[0], "myHoverClass"], removeClassArgs);
				tests.assertEqual(dojo.query(".webmapZoomOut")[0], button);
				dojo.disconnect(conn);
				c.destroy();
			}
		},
		{
			name: "_doClick",
			setUp: function(){
				doZoomControlSetup();
			},
			runTest: function(){
				var c = new webmap.widget.ZoomControl({}, div);
				c.startup();
				c._changeZoomLevel = function(z){c._zoomLevel = parseInt(z);};
				c._doClick({target:dojo.query(".webmapZoomLevel")[3]});
				tests.assertEqual(dojo.query(".webmapZoomLevel")[3].getAttribute("level"), c._zoomLevel);
				var prevZoom = c._zoomLevel;
				c._doClick({target:dojo.query(".webmapZoomIn")[0]});
				tests.assertEqual(prevZoom + 1, c._zoomLevel);
				c._doClick({target:dojo.query(".webmapZoomOut")[0]});
				tests.assertEqual(prevZoom, c._zoomLevel);
				c.destroy();
			}
		},
		{
			name: "_getHoverClass",
			setUp: function(){
				doZoomControlSetup();
			},
			runTest: function(){
				var c = new webmap.widget.ZoomControl({}, div);
				c.startup();
				tests.assertEqual("webmapZoomLevelHover", c._getHoverClass(dojo.query(".webmapZoomLevel")[3]));
				tests.assertEqual("webmapZoomInHover", c._getHoverClass(dojo.query(".webmapZoomIn")[0]));
				tests.assertEqual("webmapZoomOutHover", c._getHoverClass(dojo.query(".webmapZoomOut")[0]));
				tests.assertEqual("webmapZoomLevelHover", c._getHoverClass(dojo.query(".webmapZoomLevel")[2]));
				c.destroy();
			}
		}
	]
);