asynctest('browser/alien/EditorSettingsTest', [
	'tinymce/inlite/alien/EditorSettings',
	'ephox/tinymce',
	'ephox.agar.api.Step',
	'ephox.agar.api.Pipeline',
	'ephox.agar.api.Assertions'
], function (EditorSettings, tinymce, Step, Pipeline, Assertions) {
	var success = arguments[arguments.length - 2];
	var failure = arguments[arguments.length - 1];

	var handler = function () {
	};

	var defaultHandler = function () {
	};

	var createEditor = function () {
		var editor = new tinymce.Editor('id', {
			string: 'value',
			bool: true,
			number: 3,
			handler: handler,
			toolbar_string1: 'a b',
			toolbar_string2: 'a,b',
			toolbar_string_empty1: '',
			toolbar_string_empty2: ',,,',
			toolbar_empty_array: [],
			toolbar_bool_false: false,
			toolbar_array: ['a', 'b']
		}, tinymce.EditorManager);

		return editor;
	};

	/*eslint max-len:0*/

	var sTestGetStringOr = Step.sync(function () {
		var editor = createEditor();
		Assertions.assertEq('Should be a specified settings string value', 'value', EditorSettings.getStringOr(editor, 'string', 'default'));
		Assertions.assertEq('Should be default string value', 'default', EditorSettings.getStringOr(editor, 'non_existing', 'default'));
		Assertions.assertEq('Should be default string value on a bool', 'default', EditorSettings.getStringOr(editor, 'bool', 'default'));
	});

	var sTestGetBoolOr = Step.sync(function () {
		var editor = createEditor();
		Assertions.assertEq('Should be a specified settings bool value', true, EditorSettings.getBoolOr(editor, 'bool', false));
		Assertions.assertEq('Should be default bool value', false, EditorSettings.getBoolOr(editor, 'non_existing', false));
		Assertions.assertEq('Should be default bool value on a string', false, EditorSettings.getBoolOr(editor, 'string', false));
	});

	var sTestGetNumberOr = Step.sync(function () {
		var editor = createEditor();
		Assertions.assertEq('Should be a specified settings number value', 3, EditorSettings.getNumberOr(editor, 'number', 3));
		Assertions.assertEq('Should be default number value', 5, EditorSettings.getNumberOr(editor, 'non_existing', 5));
		Assertions.assertEq('Should be default number value on a string', 5, EditorSettings.getNumberOr(editor, 'string', 5));
	});

	var sTestGetHandlerOr = Step.sync(function () {
		var editor = createEditor();
		Assertions.assertEq('Should be a specified settings handler value', handler, EditorSettings.getHandlerOr(editor, 'handler', defaultHandler));
		Assertions.assertEq('Should be default handler value', defaultHandler, EditorSettings.getHandlerOr(editor, 'non_existing', defaultHandler));
		Assertions.assertEq('Should be default handler value on a string', defaultHandler, EditorSettings.getHandlerOr(editor, 'string', defaultHandler));
	});

	var sTestToolbarItemsOr = Step.sync(function () {
		var editor = createEditor();
		Assertions.assertEq('Should be a specified toolbar items string value 1', ['a', 'b'], EditorSettings.getToolbarItemsOr(editor, 'toolbar_string1', ['c', 'd']));
		Assertions.assertEq('Should be a specified toolbar items string value 2', ['a', 'b'], EditorSettings.getToolbarItemsOr(editor, 'toolbar_string2', ['c', 'd']));
		Assertions.assertEq('Should be a specified toolbar items array value', ['a', 'b'], EditorSettings.getToolbarItemsOr(editor, 'toolbar_array', ['c', 'd']));
		Assertions.assertEq('Should be an empty toolbar items array', [], EditorSettings.getToolbarItemsOr(editor, 'toolbar_string_empty1', ['c', 'd']));
		Assertions.assertEq('Should be an empty toolbar items array', [], EditorSettings.getToolbarItemsOr(editor, 'toolbar_string_empty2', ['c', 'd']));
		Assertions.assertEq('Should be an empty toolbar items array', [], EditorSettings.getToolbarItemsOr(editor, 'toolbar_bool_false', ['c', 'd']));
		Assertions.assertEq('Should be an empty toolbar items array', [], EditorSettings.getToolbarItemsOr(editor, 'toolbar_empty_array', ['c', 'd']));
		Assertions.assertEq('Should be default toolbar items value', ['c', 'd'], EditorSettings.getToolbarItemsOr(editor, 'non_existing', ['c', 'd']));
		Assertions.assertEq('Should be default toolbar items value on a bool', ['c', 'd'], EditorSettings.getToolbarItemsOr(editor, 'bool', ['c', 'd']));
	});

	Pipeline.async({}, [
		sTestGetStringOr,
		sTestGetBoolOr,
		sTestGetNumberOr,
		sTestGetHandlerOr,
		sTestToolbarItemsOr
	], function () {
		success();
	}, failure);
});
