public void Can_Parse_String_Values()
		{
			var reader = new FakeConfigReader();

			reader.Get<string>("text").Should().Be("text");
			reader.Get<string>(String.Empty).Should().BeEmpty();
		}
		public void Cannot_Parse_Values_Of_Unkown_Type()
		{
			Action action;
			var reader = new FakeConfigReader();

			action = () => reader.Get<NullConfigReader>("name");
			action.ShouldThrow<ConfigurationException>()
				.WithMessage("Cannot read configuration value of unknown type NullConfigReader.");
		}
		public void Can_Detect_Empty_Values()
		{
			var reader = new FakeConfigReader();

			reader.IsEmpty(null).Should().BeTrue();
			reader.IsEmpty(String.Empty).Should().BeFalse();
			reader.IsEmpty("   ").Should().BeFalse();
			reader.IsEmpty("name").Should().BeFalse();
		}
		public void Can_Parse_Boolean_Values()
		{
			Action action;
			var reader = new FakeConfigReader();

			reader.Get<bool>("true").Should().BeTrue();
			reader.Get<bool>("True").Should().BeTrue();
			reader.Get<bool>("TRUE").Should().BeTrue();
			reader.Get<bool>("TrUe").Should().BeTrue();

			reader.Get<bool>("false").Should().BeFalse();
			reader.Get<bool>("False").Should().BeFalse();
			reader.Get<bool>("FALSE").Should().BeFalse();
			reader.Get<bool>("FaLsE").Should().BeFalse();

			action = () => reader.Get<bool>("yes");
			action.ShouldThrow<ConfigurationException>()
				.WithMessage("Configuration parameter 'yes' should contain value of type Boolean.");
		}
		public void Can_Parse_Byte_Values()
		{
			Action action;
			var reader = new FakeConfigReader();

			reader.Get<byte>("25").Should().Be(25);

			action = () => reader.Get<byte>("-38");
			action.ShouldThrow<ConfigurationException>()
				.WithMessage("Configuration parameter '-38' should contain value of type Byte.");

			action = () => reader.Get<byte>("1000");
			action.ShouldThrow<ConfigurationException>()
				.WithMessage("Configuration parameter '1000' should contain value of type Byte.");

			action = () => reader.Get<byte>("NaN");
			action.ShouldThrow<ConfigurationException>()
				.WithMessage("Configuration parameter 'NaN' should contain value of type Byte.");
		}
		public void Can_Parse_Enum_Values()
		{
			Action action;
			var reader = new FakeConfigReader();

			reader.Get<FakeEnum>("Zero").Should().Be(FakeEnum.Zero);
			reader.Get<FakeEnum>("one").Should().Be(FakeEnum.One);
			reader.Get<FakeEnum>("TWO").Should().Be(FakeEnum.Two);
			reader.Get<FakeEnum>("0").Should().Be(FakeEnum.Zero);
			reader.Get<FakeEnum>("1").Should().Be(FakeEnum.One);
			reader.Get<FakeEnum>("2").Should().Be(FakeEnum.Two);
			reader.Get<FakeEnum>("3").Should().NotBe(FakeEnum.Zero)
				.And.Should().NotBe(FakeEnum.One)
				.And.Should().NotBe(FakeEnum.Two);

			action = () => reader.Get<FakeEnum>("unknown");
			action.ShouldThrow<ConfigurationException>()
				.WithMessage("Configuration parameter 'unknown' should contain value of type FakeEnum.");
		}
		public void Can_Parse_Guid_Values()
		{
			Action action;
			var reader = new FakeConfigReader();

			Guid id = new Guid("2DC0B86E-3E16-445A-88B8-C39EFF611331");
			reader.Get<Guid>("{2DC0B86E-3E16-445A-88B8-C39EFF611331}").Should().Be(id);
			reader.Get<Guid>("2DC0B86E-3E16-445A-88B8-C39EFF611331").Should().Be(id);
			reader.Get<Guid>("2dc0b86e-3e16-445a-88b8-c39eff611331").Should().Be(id);
			reader.Get<Guid>("2dc0b86e3e16445a88b8c39eff611331").Should().Be(id);

			action = () => reader.Get<Guid>("unknown");
			action.ShouldThrow<ConfigurationException>()
				.WithMessage("Configuration parameter 'unknown' should contain value of type Guid.");
		}
		public void Can_Parse_DateTime_Values()
		{
			Action action;
			var reader = new FakeConfigReader();

			reader.Get<DateTime>("1983-05-25").Should().Be(new DateTime(1983, 05, 25));
			reader.Get<DateTime>("2000-11-21 15:20:57").Should().Be(new DateTime(2000, 11, 21, 15, 20, 57));
			reader.Get<DateTime>("2000/11/21 15:20:57").Should().Be(new DateTime(2000, 11, 21, 15, 20, 57));

			action = () => reader.Get<DateTime>("unknown");
			action.ShouldThrow<ConfigurationException>()
				.WithMessage("Configuration parameter 'unknown' should contain value of type DateTime.");
		}
		public void Can_Parse_TimeSpan_Values()
		{
			Action action;
			var reader = new FakeConfigReader();

			reader.Get<TimeSpan>("15:20:57").Should().Be(TimeSpan.Parse("15:20:57"));
			reader.Get<TimeSpan>("25:20:57").Should().Be(TimeSpan.Parse("25:20:57"));
			reader.Get<TimeSpan>("1:15:20:57").Should().Be(TimeSpan.Parse("1:15:20:57"));

			action = () => reader.Get<TimeSpan>("unknown");
			action.ShouldThrow<ConfigurationException>()
				.WithMessage("Configuration parameter 'unknown' should contain value of type TimeSpan.");
		}
		public void Can_Parse_Decimal_Values()
		{
			Action action;
			var reader = new FakeConfigReader();

			reader.Get<decimal>("2.5").Should().Be(2.5m);
			reader.Get<decimal>("-0.2").Should().Be(-0.2m);
			reader.Get<decimal>("1000").Should().Be(1000m);
			reader.Get<decimal>("0.12345678901234567890").Should().Be(0.12345678901234567890m);

			action = () => reader.Get<decimal>("NaN");
			action.ShouldThrow<ConfigurationException>()
				.WithMessage("Configuration parameter 'NaN' should contain value of type Decimal.");

			action = () => reader.Get<decimal>("Infinity");
			action.ShouldThrow<ConfigurationException>()
				.WithMessage("Configuration parameter 'Infinity' should contain value of type Decimal.");

			reader.Get<decimal>("0").Should().Be(0);
			reader.Get<decimal>("+0").Should().Be(0);
			reader.Get<decimal>("-0").Should().Be(0);

			action = () => reader.Get<decimal>("100000000000000000000000000000");
			action.ShouldThrow<ConfigurationException>()
				.WithMessage("Configuration parameter '100000000000000000000000000000' should contain value of type Decimal.");
		}
		public void Can_Parse_Double_Values()
		{
			Action action;
			var reader = new FakeConfigReader();

			reader.Get<double>("2.5").Should().Be(2.5d);
			reader.Get<double>("-0.2").Should().Be(-0.2d);
			reader.Get<double>("1000").Should().Be(1000d);
			reader.Get<double>("3.4e-12").Should().Be(3.4e-12d);

			reader.Get<double>("NaN").Should().Be(Double.NaN);
			reader.Get<double>("-Infinity").Should().Be(Double.NegativeInfinity);
			reader.Get<double>("Infinity").Should().Be(Double.PositiveInfinity);

			action = () => reader.Get<double>("+Infinity");
			action.ShouldThrow<ConfigurationException>()
				.WithMessage("Configuration parameter '+Infinity' should contain value of type Double.");

			reader.Get<double>("0").Should().Be(0);
			reader.Get<double>("+0").Should().Be(0);
			reader.Get<double>("-0").Should().Be(0);

			action = () => reader.Get<double>("1e309");
			action.ShouldThrow<ConfigurationException>()
				.WithMessage("Configuration parameter '1e309' should contain value of type Double.");
		}