isDark())->toBeTrue() ->and($module->isLight())->toBeFalse(); }); test('can create light module', function () { $module = Module::light(); expect($module->isLight())->toBeTrue() ->and($module->isDark())->toBeFalse(); }); test('can create from boolean', function () { $dark = Module::fromBool(true); $light = Module::fromBool(false); expect($dark->isDark())->toBeTrue() ->and($light->isLight())->toBeTrue(); }); test('can create from bit', function () { $dark = Module::fromBit(1); $light = Module::fromBit(0); expect($dark->isDark())->toBeTrue() ->and($light->isLight())->toBeTrue(); }); test('can convert to bit', function () { $dark = Module::dark(); $light = Module::light(); expect($dark->toBit())->toBe(1) ->and($light->toBit())->toBe(0); }); test('can invert module', function () { $dark = Module::dark(); $light = Module::light(); $invertedDark = $dark->invert(); $invertedLight = $light->invert(); expect($invertedDark->isLight())->toBeTrue() ->and($invertedLight->isDark())->toBeTrue(); }); test('invert returns new instance', function () { $original = Module::dark(); $inverted = $original->invert(); // Original unchanged expect($original->isDark())->toBeTrue() ->and($inverted->isLight())->toBeTrue(); }); test('can convert to string', function () { $dark = Module::dark(); $light = Module::light(); expect($dark->toString())->toBe('█') ->and($light->toString())->toBe('░'); }); test('dark and light are opposites', function () { $dark = Module::dark(); $light = Module::light(); expect($dark->isDark())->not->toBe($light->isDark()) ->and($dark->isLight())->not->toBe($light->isLight()); }); test('module is immutable', function () { $module = Module::dark(); // Attempting to invert doesn't change original $module->invert(); expect($module->isDark())->toBeTrue(); });