using System;

using Shouldly;

using ICSharpCode.ILSpy.AppEnv;

using NUnit.Framework;

namespace ICSharpCode.ILSpy.Tests
{
	[TestFixture]
	public class CommandLineArgumentsTests
	{
		[Test]
		public void VerifyEmptyArgumentsArray()
		{
			var cmdLineArgs = CommandLineArguments.Create(new string[] { });

			cmdLineArgs.AssembliesToLoad.ShouldBeEmpty();
			cmdLineArgs.SingleInstance.ShouldBeNull();
			cmdLineArgs.NavigateTo.ShouldBeNull();
			cmdLineArgs.Search.ShouldBeNull();
			cmdLineArgs.Language.ShouldBeNull();
			cmdLineArgs.NoActivate.ShouldBeFalse();
			cmdLineArgs.ConfigFile.ShouldBeNull();
		}

		[Test]
		public void VerifyHelpOption()
		{
			var cmdLineArgs = CommandLineArguments.Create(new string[] { "--help" });
			cmdLineArgs.ArgumentsParser.IsShowingInformation.ShouldBeTrue();
		}

		[Test]
		public void VerifyForceNewInstanceOption()
		{
			var cmdLineArgs = CommandLineArguments.Create(new string[] { "--newinstance" });
			cmdLineArgs.SingleInstance.ShouldNotBeNull();
			cmdLineArgs.SingleInstance.Value.ShouldBeFalse();
		}

		[Test]
		public void VerifyNavigateToOption()
		{
			const string navigateTo = "MyNamespace.MyClass";
			var cmdLineArgs = CommandLineArguments.Create(new string[] { "--navigateto", navigateTo });
			cmdLineArgs.NavigateTo.ShouldBe(navigateTo);
		}

		[Test]
		public void VerifyNavigateToOption_NoneTest_Matching_VSAddin()
		{
			var cmdLineArgs = CommandLineArguments.Create(new string[] { "--navigateto:none" });
			cmdLineArgs.NavigateTo.ShouldBe("none");
		}

		[Test]
		public void VerifyCaseSensitivityOfOptionsDoesntThrow()
		{
			var cmdLineArgs = CommandLineArguments.Create(new string[] { "--navigateTo:none" });

			cmdLineArgs.ArgumentsParser.RemainingArguments.Count.ShouldBe(1);
		}

		[Test]
		public void VerifySearchOption()
		{
			const string searchWord = "TestContainers";
			var cmdLineArgs = CommandLineArguments.Create(new string[] { "--search", searchWord });
			cmdLineArgs.Search.ShouldBe(searchWord);
		}

		[Test]
		public void VerifyLanguageOption()
		{
			const string language = "csharp";
			var cmdLineArgs = CommandLineArguments.Create(new string[] { "--language", language });
			cmdLineArgs.Language.ShouldBe(language);
		}

		[Test]
		public void VerifyConfigOption()
		{
			const string configFile = "myilspyoptions.xml";
			var cmdLineArgs = CommandLineArguments.Create(new string[] { "--config", configFile });
			cmdLineArgs.ConfigFile.ShouldBe(configFile);
		}

		[Test]
		public void VerifyNoActivateOption()
		{
			var cmdLineArgs = CommandLineArguments.Create(new string[] { "--noactivate" });
			cmdLineArgs.NoActivate.ShouldBeTrue();
		}

		[Test]
		public void MultipleAssembliesAsArguments()
		{
			var cmdLineArgs = CommandLineArguments.Create(new string[] { "assembly1", "assembly2", "assembly3" });
			cmdLineArgs.AssembliesToLoad.Count.ShouldBe(3);
		}

		[Test]
		public void PassAtFileArguments()
		{
			string filepath = System.IO.Path.GetTempFileName();

			System.IO.File.WriteAllText(filepath, "assembly1\r\nassembly2\r\nassembly3\r\n--newinstance\r\n--noactivate");

			var cmdLineArgs = CommandLineArguments.Create(new string[] { $"@{filepath}" });

			try
			{
				System.IO.File.Delete(filepath);
			}
			catch (Exception)
			{
			}

			cmdLineArgs.SingleInstance.ShouldNotBeNull();
			cmdLineArgs.SingleInstance.Value.ShouldBeFalse();
			cmdLineArgs.NoActivate.ShouldBeTrue();
			cmdLineArgs.AssembliesToLoad.Count.ShouldBe(3);
		}
	}
}