utils.import('../../modules/utils.js');
assert.isDefined(TreeStyleTabUtils);

var random = parseInt(Math.random() * 65000);
var root = 'extensions.treestyletab.';

function clearTestPrefs()
{
	utils.clearPref(random+'.bool');
	utils.clearPref(random+'.int');
	utils.clearPref(random+'.string');
	utils.clearPref('extensions.treestyletab.'+random+'.bool');
	utils.clearPref('extensions.treestyletab.'+random+'.int');
	utils.clearPref('extensions.treestyletab.'+random+'.string');
	utils.clearPref('extensions.treestyletab.'+random+'.domain1.pref');
	utils.clearPref('extensions.treestyletab.'+random+'.domain2.pref');
	utils.clearPref('extensions.treestyletab.'+random+'.domain3.pref');
}

function setUp()
{
	clearTestPrefs();
}

function tearDown()
{
	clearTestPrefs();
}

function test_setAndGetPref()
{
	function assertSetAndGetTreePref(aPref, aValue)
	{
		assert.isNull(utils.getPref(root+aPref));
		assert.isNull(TreeStyleTabUtils.getTreePref(aPref));

		TreeStyleTabUtils.setTreePref(aPref, aValue);

		assert.isNotNull(utils.getPref(root+aPref));
		assert.equals(aValue, utils.getPref(root+aPref));

		assert.isNotNull(TreeStyleTabUtils.getTreePref(aPref));
		assert.equals(aValue, TreeStyleTabUtils.getTreePref(aPref));
	}

	assertSetAndGetTreePref(random+'.bool', true);
	assertSetAndGetTreePref(random+'.int', 29);
	assertSetAndGetTreePref(random+'.string', 'string');
}

function test_listeners()
{
	var singleDomainListener = {
			domain  : root+random+'.domain1',
			observe : function(aSubject, aTopic, aData)
			{
				this.messages.push([aTopic, aData]);
			},
			messages : []
		};

	var multipleDomainsListener = {
			domains : [
				root+random+'.domain2',
				root+random+'.domain3'
			],
			observe : function(aSubject, aTopic, aData)
			{
				this.messages.push([aTopic, aData]);
			},
			messages : []
		};

	TreeStyleTabUtils.prefs.addPrefListener(singleDomainListener);
	utils.setPref(root+random+'.domain1.pref', true);
	utils.setPref(root+random+'.domain1.pref', false);
	assert.equals(
		[
			['nsPref:changed', root+random+'.domain1.pref'],
			['nsPref:changed', root+random+'.domain1.pref']
		],
		singleDomainListener.messages
	);
	singleDomainListener.messages = [];
	TreeStyleTabUtils.prefs.removePrefListener(singleDomainListener);
	utils.setPref(root+random+'.domain1.pref', true);
	utils.setPref(root+random+'.domain1.pref', false);
	assert.equals([], singleDomainListener.messages);

	TreeStyleTabUtils.prefs.addPrefListener(multipleDomainsListener);
	utils.setPref(root+random+'.domain2.pref', true);
	utils.setPref(root+random+'.domain3.pref', true);
	utils.setPref(root+random+'.domain2.pref', false);
	utils.setPref(root+random+'.domain3.pref', false);
	assert.equals(
		[
			['nsPref:changed', root+random+'.domain2.pref'],
			['nsPref:changed', root+random+'.domain3.pref'],
			['nsPref:changed', root+random+'.domain2.pref'],
			['nsPref:changed', root+random+'.domain3.pref']
		],
		multipleDomainsListener.messages
	);
	multipleDomainsListener.messages = [];
	TreeStyleTabUtils.prefs.removePrefListener(multipleDomainsListener);
	utils.setPref(root+random+'.domain2.pref', true);
	utils.setPref(root+random+'.domain3.pref', true);
	utils.setPref(root+random+'.domain2.pref', false);
	utils.setPref(root+random+'.domain3.pref', false);
	assert.equals([], multipleDomainsListener.messages);
}