dojo.provide("tests.webmap.widget.ToolControl");

dojo.require("doh.runner");
dojo.require("webmap.widget.ToolControl");
dojo.require("tests.Util");

var div;
function doToolControlSetup(){
	tests.Util.resetDom();
	div = document.createElement("div");
	document.body.appendChild(div);
}
doh.register("tests.webmap.widget.ToolControl", 
	[
	
		{
			name: "postCreate",
			setUp: function(){
				doToolControlSetup();
			},
			runTest: function(){
				var c = new webmap.widget.ToolControl({}, div);
				tests.assertEqual(1, c._subscriptions.length);
				tests.assertEqual(webmap.config.defaultTool, c.tool);
				c.destroy();
				div = document.createElement("div");
				document.body.appendChild(div);
				c = new webmap.widget.ToolControl({tool:"zoomIn"}, div);
				tests.assertEqual("zoomIn", c.tool);	
				c.destroy();
			}
		},
		{
			name: "_setStartupTool",
			setUp: function(){
				doToolControlSetup();
			},
			runTest: function(){
				var c = new webmap.widget.ToolControl({}, div);
				var clicks = 0;
				var clickArgs = null;
				c._doClick = function(args){clickArgs = args; clicks++;};
				c._setStartupTool();
				tests.assertEqual(1, clicks);
				var expected = null;
				for (var i = 0; i < c.buttons.length; i++){
					if (c.buttons[i].getAttribute("tool") == c.tool){
						expected = {target:c.buttons[i]};
						break;
					}
				}
				tests.assertEqual(expected, clickArgs);
				window.undockedWin = "not null";
				var clicks = 0;
				var clickArgs = null;
				c._setStartupTool();
				tests.assertEqual(0, clicks);
				tests.assertEqual(null, clickArgs);
				c.destroy();
				window.undockedWin = null;
			}			
		},
		{
			name: "_changeTool",
			setUp: function(){
				doToolControlSetup();
			},
			runTest: function(){
				var c = new webmap.widget.ToolControl({tool:"identify"}, div);
				var evtCount = 0;
				var evtArgs = null;
				var evtCounter = function(args){evtArgs = args;evtCount++;}
				var s = dojo.subscribe("webmap.widget.ToolControl.toolChanged", evtCounter);
				tests.assertEqual("identify", c.tool);
				c._changeTool("zoomIn");
				tests.assertEqual("zoomIn", c.tool);
				tests.assertEqual(1, evtCount);
				tests.assertEqual({tool:"zoomIn"}, evtArgs);
				c.destroy();
				window.undockedWin = null;
				dojo.unsubscribe(s);
			}			
		},
		{
			name: "_toggleTool",
			setUp: function(){
				doToolControlSetup();
			},
			runTest: function(){
				var c = new webmap.widget.ToolControl({}, div);
				c.startup();
				tests.assertEqual("table-cell", dojo.style(dojo.query(".webmapZoomInTool")[0].parentNode, "display"));
				webmap.publish("webmap.MapManager.toolToggled", [{tool:"zoomIn"}]);
				tests.assertEqual("none", dojo.style(dojo.query(".webmapZoomInTool")[0].parentNode, "display"));
				tests.assertTrue(dojo.query(".webmapIdentifyTool")[0].className.indexOf("Active") > -1);
				tests.assertTrue(dojo.query(".webmapPanTool")[0].className.indexOf("Active") == -1);
				webmap.publish("webmap.MapManager.toolToggled", [{tool:"identify"}]);
				tests.assertTrue(dojo.query(".webmapIdentifyTool")[0].className.indexOf("Active") == -1);
				tests.assertTrue(dojo.query(".webmapPanTool")[0].className.indexOf("Active") > -1);
				tests.assertEqual("none", dojo.style(dojo.query(".webmapIdentifyTool")[0].parentNode, "display"));
				webmap.publish("webmap.MapManager.toolToggled", [{tool:"identify"}]);
				tests.assertEqual("table-cell", dojo.style(dojo.query(".webmapIdentifyTool")[0].parentNode, "display"));
				tests.assertTrue(dojo.query(".webmapIdentifyTool")[0].className.indexOf("Active") == -1);
				c.destroy();
			}			
		},
		{
			name: "_nextTool",
			setUp: function(){
				doToolControlSetup();
			},
			runTest: function(){
				var c = new webmap.widget.ToolControl({}, div);
				c.startup();
				var clicks = 0;
				var clickArgs = null;
				c._doClick = function(args){clickArgs = args; clicks++;};
				c._nextTool();
				tests.assertEqual(1, clicks);
				tests.assertEqual({target:dojo.query(".webmapPanTool")[0]}, clickArgs);
				dojo.style(dojo.query(".webmapPanTool")[0].parentNode, "display", "none");
				var clickArgs = null;
				c._nextTool();
				tests.assertEqual(2, clicks);
				tests.assertEqual({target:dojo.query(".webmapZoomInTool")[0]}, clickArgs);
			}			
		},
		{
			name: "_doMouseOver",
			setUp: function(){
				doToolControlSetup();
			},
			runTest: function(){
				var c = new webmap.widget.ToolControl({}, 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._getClasses = function(b){classesCalls++; button = b; return {hover:"myHoverClass"};};
				c._doMouseOver({target:dojo.query(".webmapZoomInTool")[0]});
				tests.assertEqual(1, addClassCalls);
				tests.assertEqual(1, classesCalls);
				tests.assertEqual([dojo.query(".webmapZoomInTool")[0], "myHoverClass"], addClassArgs);
				tests.assertEqual(dojo.query(".webmapZoomInTool")[0], button);
				c._doMouseOver({target:dojo.query(".webmapPanTool")[0]});
				tests.assertEqual(2, addClassCalls);
				tests.assertEqual(2, classesCalls);
				tests.assertEqual([dojo.query(".webmapPanTool")[0], "myHoverClass"], addClassArgs);
				tests.assertEqual(dojo.query(".webmapPanTool")[0], button);
				dojo.disconnect(conn);
				c.destroy();
			}			
		},
		{
			name: "_doMouseOut",
			setUp: function(){
				doToolControlSetup();
			},
			runTest: function(){
				var c = new webmap.widget.ToolControl({}, 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._getClasses = function(b){classesCalls++; button = b; return {hover:"myHoverClass"};};
				c._doMouseOut({target:dojo.query(".webmapZoomInTool")[0]});
				tests.assertEqual(1, removeClassCalls);
				tests.assertEqual(1, classesCalls);
				tests.assertEqual([dojo.query(".webmapZoomInTool")[0], "myHoverClass"], removeClassArgs);
				tests.assertEqual(dojo.query(".webmapZoomInTool")[0], button);
				c._doMouseOut({target:dojo.query(".webmapPanTool")[0]});
				tests.assertEqual(2, removeClassCalls);
				tests.assertEqual(2, classesCalls);
				tests.assertEqual([dojo.query(".webmapPanTool")[0], "myHoverClass"], removeClassArgs);
				tests.assertEqual(dojo.query(".webmapPanTool")[0], button);
				dojo.disconnect(conn);
				c.destroy();
			}			
		},
		{
			name: "_doClick",
			setUp: function(){
				doToolControlSetup();
			},
			runTest: function(){
				var c = new webmap.widget.ToolControl({}, div);
				c.startup();
				var addClassCalls = 0;
				var addClassArgs = null;
				c.dojoAddCallCounter = function(node, value){addClassCalls++; addClassArgs = [node, value];};
				var conns = new Array();
				conns.push(dojo.connect(dojo, "addClass", c, "dojoAddCallCounter"));
				var removeClassCalls = 0;
				var removeClassArgs = new Array();
				c.dojoRemoveCallCounter = function(node, value){removeClassCalls++; removeClassArgs.push([node, value]);};
				conns.push(dojo.connect(dojo, "removeClass", c, "dojoRemoveCallCounter"));
				var classesCalls = 0;
				var button = null;
				c._getClasses = function(b){classesCalls++; button = b; return {active:"myActiveClass"};};
				var changes = 0;
				var changeArgs = null;
				c._changeTool = function(args){changes++; changeArgs = args;};
				c._doClick({target:dojo.query(".webmapZoomInTool")[0]});
				tests.assertEqual(c.buttons.length, removeClassCalls);
				tests.assertEqual([[dojo.query(".webmapPanTool")[0], "myActiveClass"], 
					[dojo.query(".webmapZoomInTool")[0], "myActiveClass"],
					[dojo.query(".webmapIdentifyTool")[0], "myActiveClass"]], removeClassArgs);
				tests.assertEqual(1, addClassCalls);
				tests.assertEqual(c.buttons.length + 1, classesCalls);
				tests.assertEqual([dojo.query(".webmapZoomInTool")[0], "myActiveClass"], addClassArgs);
				tests.assertEqual(dojo.query(".webmapZoomInTool")[0], button);
				tests.assertEqual(1, changes);
				tests.assertEqual("zoomIn", changeArgs);
				var removeClassArgs = new Array();
				c._doClick({target:dojo.query(".webmapPanTool")[0]});
				tests.assertEqual(2 * c.buttons.length, removeClassCalls);
				tests.assertEqual([[dojo.query(".webmapPanTool")[0], "myActiveClass"], 
					[dojo.query(".webmapZoomInTool")[0], "myActiveClass"],
					[dojo.query(".webmapIdentifyTool")[0], "myActiveClass"]], removeClassArgs);
				tests.assertEqual(2, addClassCalls);
				tests.assertEqual((2 * c.buttons.length) + 2, classesCalls);
				tests.assertEqual([dojo.query(".webmapPanTool")[0], "myActiveClass"], addClassArgs);
				tests.assertEqual([[dojo.query(".webmapPanTool")[0], "myActiveClass"], 
					[dojo.query(".webmapZoomInTool")[0], "myActiveClass"],
					[dojo.query(".webmapIdentifyTool")[0], "myActiveClass"]], removeClassArgs);
				tests.assertEqual(dojo.query(".webmapPanTool")[0], button);
				tests.assertEqual(2, changes);
				tests.assertEqual("pan", changeArgs);
				for (var i = 0; i < conns.length; i++)
					dojo.disconnect(conns[i]);
				c.destroy();
			}			
		}, 
		{
			name: "_getClasses",
			setUp: function(){
				doToolControlSetup();
			},
			runTest: function(){
				var c = new webmap.widget.ToolControl({}, div);
				tests.assertEqual({hover:"webmapPanToolHover",active:"webmapPanToolActive"}, c._getClasses(dojo.query(".webmapPanTool")[0]));
				tests.assertEqual({hover:"webmapZoomInToolHover",active:"webmapZoomInToolActive"}, c._getClasses(dojo.query(".webmapZoomInTool")[0]));
				tests.assertEqual({hover:"webmapIdentifyToolHover",active:"webmapIdentifyToolActive"}, c._getClasses(dojo.query(".webmapIdentifyTool")[0]));
				tests.assertEqual({}, c._getClasses(dojo.query(".webmapToolControl")[0]));
				c.destroy();
			}
		}
	]
);