/*
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 *
*/

using System;
using log4net.Util;
using NUnit.Framework;
using System.IO;
using System.Reflection;
using System.Configuration;

namespace log4net.Tests.Util
{
	[TestFixture]
	public class PatternStringTest : MarshalByRefObject
	{
		[Test]
		public void TestEnvironmentFolderPathPatternConverter()
		{
			string[] specialFolderNames = Enum.GetNames(typeof(Environment.SpecialFolder));

			foreach (string specialFolderName in specialFolderNames)
			{
				string pattern = "%envFolderPath{" + specialFolderName + "}";

				PatternString patternString = new PatternString(pattern);

				string evaluatedPattern = patternString.Format();

				Environment.SpecialFolder specialFolder =
					(Environment.SpecialFolder)Enum.Parse(typeof(Environment.SpecialFolder), specialFolderName);

				Assert.AreEqual(Environment.GetFolderPath(specialFolder), evaluatedPattern);
			}
		}

		[Test]
		public void TestAppSettingPathConverter()
		{
			string configurationFileContent = @"
<configuration>
  <appSettings>
	<add key=""TestKey"" value = ""TestValue"" />
  </appSettings>
</configuration>
";
			string configurationFileName = null;
			AppDomain appDomain = null;
			try
			{
				configurationFileName = CreateTempConfigFile(configurationFileContent);
				appDomain = CreateConfiguredDomain("AppSettingsTestDomain", configurationFileName);

				PatternStringTest pst = (PatternStringTest)appDomain.CreateInstanceAndUnwrap(Assembly.GetExecutingAssembly().FullName, this.GetType().FullName);
				pst.TestAppSettingPathConverterInConfiguredDomain();
			}
			finally
			{
				if (appDomain != null) AppDomain.Unload(appDomain);
				if (configurationFileName != null) File.Delete(configurationFileName);
			}
		}

		public void TestAppSettingPathConverterInConfiguredDomain()
		{
			string pattern = "%appSetting{TestKey}";
			PatternString patternString = new PatternString(pattern);
			string evaluatedPattern = patternString.Format();
			string appSettingValue = ConfigurationManager.AppSettings["TestKey"];
			Assert.AreEqual("TestValue", appSettingValue, "Expected configuration file to contain a key TestKey with the value TestValue");
			Assert.AreEqual(appSettingValue, evaluatedPattern, "Evaluated pattern expected to be identical to appSetting value");

			string badPattern = "%appSetting{UnknownKey}";
			patternString = new PatternString(badPattern);
			evaluatedPattern = patternString.Format();
			Assert.AreEqual("(null)", evaluatedPattern, "Evaluated pattern expected to be \"(null)\" for non-existent appSettings key");
		}

		private static string CreateTempConfigFile(string configurationFileContent)
		{
			string fileName = Path.GetTempFileName();
			File.WriteAllText(fileName, configurationFileContent);
			return fileName;
		}

		private static AppDomain CreateConfiguredDomain(string domainName, string configurationFileName)
		{
			AppDomainSetup ads = new AppDomainSetup();
			ads.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
			ads.ConfigurationFile = configurationFileName;
			AppDomain ad = AppDomain.CreateDomain(domainName, null, ads);
			return ad;
		}
	}
}
