Skip to content

Commit

Permalink
Merge 41a613f into 1182306
Browse files Browse the repository at this point in the history
  • Loading branch information
albertms10 committed Dec 8, 2022
2 parents 1182306 + 41a613f commit b583a38
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 24 deletions.
3 changes: 3 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"cSpell.words": ["powerable", "Powerable"]
}
19 changes: 10 additions & 9 deletions lib/grid.dart
Original file line number Diff line number Diff line change
@@ -1,38 +1,39 @@
import 'dart:math';

import 'package:christmas_lights_kata/led.dart';
import 'package:christmas_lights_kata/powerable_led.dart';

/// A squared grid of LEDs.
class Grid {
/// Constructs a new [Grid] from [size].
Grid(this.size)
: assert(size > 0, 'Size must be positive'),
leds = [
for (var x = 0; x < size; x++) [for (var y = 0; y < size; y++) Led()],
for (var x = 0; x < size; x++)
[for (var y = 0; y < size; y++) PowerableLed()],
];

/// The size of this [Grid].
final int size;

/// The two-dimensional matrix of [Led]s.
late final List<List<Led>> leds;
/// The two-dimensional matrix of [PowerableLed]s.
late final List<List<PowerableLed>> leds;

/// Turns on all [Led]s from [start] to [end] positions.
/// Turns on all [PowerableLed]s from [start] to [end] positions.
void turnOn(Point<int> start, Point<int> end) =>
_actOnLedsFrom(start, end, (led) => led.turnOn());

/// Turns off all [Led]s from [start] to [end] positions.
/// Turns off all [PowerableLed]s from [start] to [end] positions.
void turnOff(Point<int> start, Point<int> end) =>
_actOnLedsFrom(start, end, (led) => led.turnOff());

/// Toggles all [Led]s from [start] to [end] positions.
/// Toggles all [PowerableLed]s from [start] to [end] positions.
void toggle(Point<int> start, Point<int> end) =>
_actOnLedsFrom(start, end, (led) => led.toggle());

void _actOnLedsFrom(
Point<int> start,
Point<int> end,
void Function(Led led) action,
void Function(PowerableLed led) action,
) {
for (var x = start.x; x <= end.x; x++) {
for (var y = start.y; y <= end.y; y++) {
Expand All @@ -41,7 +42,7 @@ class Grid {
}
}

/// Returns the number of powered [Led]s in the [Grid].
/// Returns the number of powered [PowerableLed]s in the [Grid].
int get poweredLedsCount => leds.fold<int>(
0,
(count, row) => count + row.where((led) => led.isPowered).length,
Expand Down
17 changes: 9 additions & 8 deletions lib/led.dart → lib/powerable_led.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,28 +3,29 @@ import 'package:christmas_lights_kata/utils/random_string_extension.dart';
const _poweredLights = '🔴🟡🟢🔵';
const _offLight = '⚫️';

/// An LED.
class Led {
/// Constructs a new [Led].
Led({bool isPowered = false})
/// A powerable LED.
class PowerableLed {
/// Constructs a new [PowerableLed].
PowerableLed({bool isPowered = false})
: _isPowered = isPowered,
displayLight = _poweredLights.randomChar;

bool _isPowered;

/// Whether this [Led] is turned on or off.
/// Whether this [PowerableLed] is turned on or off.
bool get isPowered => _isPowered;

/// String for displaying the powered light.
late final String displayLight;

/// Turns on this [Led].
/// Turns on this [PowerableLed].
bool turnOn() => _isPowered = true;

/// Turns off this [Led].
/// Turns off this [PowerableLed].
bool turnOff() => _isPowered = false;

/// Toggles the powered state of this [Led] and returns the new state.
/// Toggles the powered state of this [PowerableLed] and returns the new
/// state.
bool toggle() => _isPowered = !_isPowered;

@override
Expand Down
14 changes: 7 additions & 7 deletions test/led_test.dart → test/powerable_led_test.dart
Original file line number Diff line number Diff line change
@@ -1,41 +1,41 @@
import 'package:christmas_lights_kata/led.dart';
import 'package:christmas_lights_kata/powerable_led.dart';
import 'package:test/test.dart';

void main() {
group('Led', () {
group('PowerableLed', () {
group('(new)', () {
test('is not powered by default', () {
final led = Led();
final led = PowerableLed();
expect(led.isPowered, isFalse);
print(led);
});

test('uses the powered value on construction', () {
final led = Led(isPowered: true);
final led = PowerableLed(isPowered: true);
expect(led.isPowered, isTrue);
print(led);
});
});

group('.turnOn()', () {
test('turns on this LED', () {
final led = Led()..turnOn();
final led = PowerableLed()..turnOn();
expect(led.isPowered, isTrue);
print(led);
});
});

group('.turnOff()', () {
test('turns off this LED', () {
final led = Led(isPowered: true)..turnOff();
final led = PowerableLed(isPowered: true)..turnOff();
expect(led.isPowered, isFalse);
print(led);
});
});

group('.toggle()', () {
test('toggles the powered state of this LED', () {
final led = Led()..toggle();
final led = PowerableLed()..toggle();
expect(led.isPowered, isTrue);
print(led);
led.toggle();
Expand Down

0 comments on commit b583a38

Please sign in to comment.