/* ###
 * IP: GHIDRA
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package ghidra.framework.project.tool;

import static org.junit.Assert.assertEquals;

import org.junit.Test;

import ghidra.framework.plugintool.PluginTool;

public class ToolSaving2Test extends AbstractToolSavingTest {

	// tests that we've changed into manual save mode and that we can get back into auto save mode
	// in the right conditions
	@Test
	public void testRevertToAutoSave() {
		PluginTool tool1 = launchTool(DEFAULT_TEST_TOOL_NAME);
		PluginTool tool2 = launchTool(DEFAULT_TEST_TOOL_NAME);

		boolean isSet = getBooleanFooOptions(tool1);
		setBooleanFooOptions(tool1, !isSet);
		setBooleanFooOptions(tool2, !isSet);
		closeToolAndManuallySave(tool1);

		// we are now in manual mode...

		// ...turn off manual mode by saving with only one tool open...
		saveTool(tool2);

		// ...change the tool again...
		isSet = getBooleanFooOptions(tool2);
		setBooleanFooOptions(tool2, !isSet);

		// ...now closing the tool should not give us a prompt
		closeToolWithNoSaveDialog(tool2);

		PluginTool newTool = launchTool(DEFAULT_TEST_TOOL_NAME);

		assertEquals("Changed tool was not saved", !isSet, getBooleanFooOptions(newTool));
	}

	// test that with two changed tools and save one, then close in opposite order without saving.
	@Test
	public void testTwoToolsBothChanged_save1_closeBothOtherOrder() {
		PluginTool tool1 = launchTool(DEFAULT_TEST_TOOL_NAME);
		PluginTool tool2 = launchTool(DEFAULT_TEST_TOOL_NAME);

		boolean isSet = getBooleanFooOptions(tool1);
		setBooleanFooOptions(tool1, !isSet);
		setBooleanFooOptions(tool2, !isSet);
		saveTool(tool1);

		closeToolAndManuallySave(tool2);
		closeToolWithNoSaveDialog(tool1);

		PluginTool newTool = launchTool(DEFAULT_TEST_TOOL_NAME);
		assertEquals("Changed tool was not saved", !isSet, getBooleanFooOptions(newTool));
	}

	@Test
	public void testTwoToolsBothChanged_saveBoth_changeOneAgain_closeBoth() {
		PluginTool tool1 = launchTool(DEFAULT_TEST_TOOL_NAME);
		PluginTool tool2 = launchTool(DEFAULT_TEST_TOOL_NAME);

		boolean isSet = getBooleanFooOptions(tool1);
		setBooleanFooOptions(tool1, !isSet);
		setBooleanFooOptions(tool2, !isSet);
		saveTool(tool1);
		saveTool(tool2);

		isSet = getBooleanFooOptions(tool1);
		setBooleanFooOptions(tool1, !isSet);

		closeToolWithNoSaveDialog(tool2);
		closeToolAndManuallySave(tool1);

		PluginTool newTool = launchTool(DEFAULT_TEST_TOOL_NAME);
		assertEquals("Changed tool was not saved", !isSet, getBooleanFooOptions(newTool));
	}
}