public static void Y2015_Day06_LightGridDrawsCorrectly3By3()
        {
            // Arrange
            var target = new Day06.LightGrid(3, 3);

            target.TurnOn(new Point(0, 0));
            target.TurnOn(new Point(0, 2));
            target.TurnOn(new Point(1, 1));
            target.TurnOn(new Point(2, 0));
            target.TurnOn(new Point(2, 2));

            string expected = string.Format(CultureInfo.InvariantCulture, "101{0}010{0}101{0}", Environment.NewLine);

            // Act
            string actual = target.ToString();

            // Assert
            Assert.Equal(expected, actual);

            // Arrange
            target.TurnOff(new Rectangle(0, 0, 3, 3));
            target.TurnOn(new Rectangle(0, 0, 2, 2));

            expected = string.Format(CultureInfo.InvariantCulture, "110{0}110{0}000{0}", Environment.NewLine);

            // Act
            actual = target.ToString();

            // Assert
            Assert.Equal(expected, actual);

            // Arrange
            target.TurnOff(new Rectangle(0, 0, 3, 3));
            target.TurnOn(new Rectangle(1, 1, 2, 2));

            expected = string.Format(CultureInfo.InvariantCulture, "000{0}011{0}011{0}", Environment.NewLine);

            // Act
            actual = target.ToString();

            // Assert
            Assert.Equal(expected, actual);

            // Arrange
            target.IncrementBrightness(new Rectangle(1, 1, 2, 2), 2);

            expected = string.Format(CultureInfo.InvariantCulture, "000{0}033{0}033{0}", Environment.NewLine);

            // Act
            actual = target.ToString();

            // Assert
            Assert.Equal(expected, actual);
        }
        public static void Y2015_Day06_LightGridExhibitsCorrectBehavior(int width, int height)
        {
            var target = new Day06.LightGrid(width, height);

            Point minimum = new Point(0, 0);
            Point maximum = new Point(width - 1, height - 1);

            Assert.Equal(0, target.Brightness);
            Assert.Equal(0, target.Count);
            Assert.Equal(0, target[minimum]);
            Assert.Equal(0, target[maximum]);

            Assert.True(target.Toggle(minimum));
            Assert.Equal(1, target[minimum]);
            Assert.Equal(1, target.Brightness);
            Assert.Equal(1, target.Count);

            Assert.True(target.Toggle(maximum));
            Assert.Equal(1, target[maximum]);
            Assert.Equal(2, target.Brightness);
            Assert.Equal(2, target.Count);

            target.TurnOn(minimum);
            Assert.Equal(1, target[minimum]);
            Assert.Equal(2, target.Brightness);
            Assert.Equal(2, target.Count);

            target.TurnOff(minimum);
            Assert.Equal(0, target[minimum]);
            Assert.Equal(1, target.Brightness);
            Assert.Equal(1, target.Count);

            target.TurnOff(minimum);
            Assert.Equal(0, target[minimum]);
            Assert.Equal(1, target.Brightness);
            Assert.Equal(1, target.Count);

            target.TurnOff(maximum);
            Assert.Equal(0, target[maximum]);
            Assert.Equal(0, target.Brightness);
            Assert.Equal(0, target.Count);

            target.TurnOn(minimum);
            Assert.Equal(1, target[minimum]);
            Assert.Equal(1, target.Brightness);
            Assert.Equal(1, target.Count);

            Assert.False(target.Toggle(minimum));
            Assert.Equal(0, target[minimum]);
            Assert.Equal(0, target.Brightness);
            Assert.Equal(0, target.Count);

            Assert.True(target.Toggle(maximum));
            Assert.Equal(1, target[maximum]);
            Assert.Equal(1, target.Brightness);
            Assert.Equal(1, target.Count);

            Rectangle bounds = new Rectangle(0, 0, width, height);

            target.TurnOff(bounds);
            Assert.Equal(0, target[minimum]);
            Assert.Equal(0, target[maximum]);
            Assert.Equal(0, target.Brightness);
            Assert.Equal(0, target.Count);

            target.TurnOff(bounds);
            Assert.Equal(0, target[minimum]);
            Assert.Equal(0, target[maximum]);
            Assert.Equal(0, target.Brightness);
            Assert.Equal(0, target.Count);

            target.TurnOn(bounds);
            Assert.Equal(1, target[minimum]);
            Assert.Equal(1, target[maximum]);
            Assert.Equal(width * height, target.Brightness);
            Assert.Equal(width * height, target.Count);

            target.TurnOn(bounds);
            Assert.Equal(1, target[minimum]);
            Assert.Equal(1, target[maximum]);
            Assert.Equal(width * height, target.Brightness);
            Assert.Equal(width * height, target.Count);

            target.Toggle(bounds);
            Assert.Equal(0, target[minimum]);
            Assert.Equal(0, target[maximum]);
            Assert.Equal(0, target.Brightness);
            Assert.Equal(0, target.Count);

            target.IncrementBrightness(minimum, 1);
            target.IncrementBrightness(minimum, 2);
            target.IncrementBrightness(minimum, 3);
            target.IncrementBrightness(minimum, -4);

            Assert.Equal(2, target[minimum]);
            Assert.Equal(2, target.Brightness);
            Assert.Equal(1, target.Count);

            target.IncrementBrightness(maximum, 10);

            Assert.Equal(2, target[minimum]);
            Assert.Equal(10, target[maximum]);
            Assert.Equal(12, target.Brightness);
            Assert.Equal(2, target.Count);

            target.IncrementBrightness(minimum, -3);

            Assert.Equal(0, target[minimum]);
            Assert.Equal(10, target[maximum]);
            Assert.Equal(10, target.Brightness);
            Assert.Equal(1, target.Count);
        }