#region Apache License
//
// 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.
//
#endregion

using System.IO;

using NUnit.Framework;

namespace log4net.Tests.Util
{
	/// <summary>
	/// Used for internal unit testing the <see cref="RandomStringPatternConverter"/> class.
	/// </summary>
	/// <remarks>
	/// Used for internal unit testing the <see cref="RandomStringPatternConverter"/> class.
	/// </remarks>
	[TestFixture]
	public class RandomStringPatternConverterTest
	{
		[Test]
		public void TestConvert()
		{
			RandomStringPatternConverter converter = new RandomStringPatternConverter();

			// Check default string length
			StringWriter sw = new StringWriter();
			converter.Convert(sw, null);

			Assert.AreEqual(4, sw.ToString().Length, "Default string length should be 4");

			// Set string length to 7
			converter.Option = "7";
			converter.ActivateOptions();

			sw = new StringWriter();
			converter.Convert(sw, null);

			string string1 = sw.ToString();
			Assert.AreEqual(7, string1.Length, "string length should be 7");

			// Check for duplicate result
			sw = new StringWriter();
			converter.Convert(sw, null);

			string string2 = sw.ToString();
			Assert.IsTrue(string1 != string2, "strings should be different");
		}

		private class RandomStringPatternConverter
		{
			private object target = null;

			public RandomStringPatternConverter()
			{
				target = Utils.CreateInstance("log4net.Util.PatternStringConverters.RandomStringPatternConverter,log4net");
			}

			public string Option
			{
				get { return Utils.GetProperty(target, "Option") as string; }
				set { Utils.SetProperty(target, "Option", value); }
			}

			public void Convert(TextWriter writer, object state)
			{
				Utils.InvokeMethod(target, "Convert", writer, state);
			}

			public void ActivateOptions()
			{
				Utils.InvokeMethod(target, "ActivateOptions");
			}
		}
	}
}