Compare commits
4 Commits
f61eea9169
...
df0dd98d7c
Author | SHA1 | Date |
---|---|---|
Marcel Kapfer | df0dd98d7c | |
Marcel Kapfer | 0bdffbeb27 | |
Marcel Kapfer | 2358ad70cc | |
Marcel Kapfer | 77cd8f62c9 |
|
@ -1 +1,2 @@
|
||||||
vendor/
|
vendor/
|
||||||
|
/.phpunit.result.cache
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
|
# Editor-based HTTP Client requests
|
||||||
|
/httpRequests/
|
||||||
|
# Datasource local storage ignored files
|
||||||
|
/dataSources/
|
||||||
|
/dataSources.local.xml
|
|
@ -0,0 +1,8 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/todo-list.iml" filepath="$PROJECT_DIR$/.idea/todo-list.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
|
@ -0,0 +1,14 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="PhpTestFrameworkVersionCache">
|
||||||
|
<tools_cache>
|
||||||
|
<tool tool_name="PHPUnit">
|
||||||
|
<cache>
|
||||||
|
<versions>
|
||||||
|
<info id="interpreter-cc25df52-c356-4ba0-a7e8-8584ab3c0c28" version="9.5.9" />
|
||||||
|
</versions>
|
||||||
|
</cache>
|
||||||
|
</tool>
|
||||||
|
</tools_cache>
|
||||||
|
</component>
|
||||||
|
</project>
|
|
@ -0,0 +1,116 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="PhpIncludePathManager">
|
||||||
|
<include_path>
|
||||||
|
<path value="$PROJECT_DIR$/vendor/phpunit/php-timer" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/phpunit/phpunit" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/phpunit/php-text-template" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/phpunit/php-invoker" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/phpunit/php-file-iterator" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/myclabs/deep-copy" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/phpunit/php-code-coverage" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/webmozart/assert" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/phpspec/prophecy" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/nikic/php-parser" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/symfony/polyfill-ctype" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/sebastian/type" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/sebastian/diff" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/phpdocumentor/reflection-docblock" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/sebastian/lines-of-code" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/phpdocumentor/type-resolver" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/sebastian/object-enumerator" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/phpdocumentor/reflection-common" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/sebastian/comparator" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/sebastian/code-unit" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/sebastian/cli-parser" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/theseer/tokenizer" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/sebastian/exporter" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/sebastian/version" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/composer" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/sebastian/complexity" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/sebastian/recursion-context" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/sebastian/resource-operations" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/sebastian/code-unit-reverse-lookup" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/sebastian/global-state" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/sebastian/environment" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/sebastian/object-reflector" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/phar-io/version" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/phar-io/manifest" />
|
||||||
|
<path value="$PROJECT_DIR$/vendor/doctrine/instantiator" />
|
||||||
|
</include_path>
|
||||||
|
</component>
|
||||||
|
<component name="PhpInterpreters">
|
||||||
|
<interpreters>
|
||||||
|
<interpreter id="cc25df52-c356-4ba0-a7e8-8584ab3c0c28" name="Debian" home="\\wsl$\Debian/usr/bin/php" debugger_id="php.debugger.XDebug">
|
||||||
|
<remote_data INTERPRETER_PATH="/usr/bin/php" HELPERS_PATH="" INITIALIZED="false" VALID="true" RUN_AS_ROOT_VIA_SUDO="false" DISTRIBUTION_ID="Debian" />
|
||||||
|
</interpreter>
|
||||||
|
</interpreters>
|
||||||
|
</component>
|
||||||
|
<component name="PhpInterpretersPhpInfoCache">
|
||||||
|
<phpInfoCache>
|
||||||
|
<interpreter name="Debian">
|
||||||
|
<phpinfo binary_type="PHP" php_cli="/usr/bin/php7.4" path_separator=":" remote_host="172.24.192.1" version="7.4.21">
|
||||||
|
<additional_php_ini>/etc/php/7.4/cli/conf.d/10-opcache.ini, /etc/php/7.4/cli/conf.d/10-pdo.ini, /etc/php/7.4/cli/conf.d/15-xml.ini, /etc/php/7.4/cli/conf.d/20-calendar.ini, /etc/php/7.4/cli/conf.d/20-ctype.ini, /etc/php/7.4/cli/conf.d/20-curl.ini, /etc/php/7.4/cli/conf.d/20-dom.ini, /etc/php/7.4/cli/conf.d/20-exif.ini, /etc/php/7.4/cli/conf.d/20-ffi.ini, /etc/php/7.4/cli/conf.d/20-fileinfo.ini, /etc/php/7.4/cli/conf.d/20-ftp.ini, /etc/php/7.4/cli/conf.d/20-gettext.ini, /etc/php/7.4/cli/conf.d/20-iconv.ini, /etc/php/7.4/cli/conf.d/20-json.ini, /etc/php/7.4/cli/conf.d/20-mbstring.ini, /etc/php/7.4/cli/conf.d/20-phar.ini, /etc/php/7.4/cli/conf.d/20-posix.ini, /etc/php/7.4/cli/conf.d/20-readline.ini, /etc/php/7.4/cli/conf.d/20-shmop.ini, /etc/php/7.4/cli/conf.d/20-simplexml.ini, /etc/php/7.4/cli/conf.d/20-sockets.ini, /etc/php/7.4/cli/conf.d/20-sysvmsg.ini, /etc/php/7.4/cli/conf.d/20-sysvsem.ini, /etc/php/7.4/cli/conf.d/20-sysvshm.ini, /etc/php/7.4/cli/conf.d/20-tokenizer.ini, /etc/php/7.4/cli/conf.d/20-xmlreader.ini, /etc/php/7.4/cli/conf.d/20-xmlwriter.ini, /etc/php/7.4/cli/conf.d/20-xsl.ini, /etc/php/7.4/cli/conf.d/20-zip.ini</additional_php_ini>
|
||||||
|
<configuration_file>/etc/php/7.4/cli/php.ini</configuration_file>
|
||||||
|
<configuration_options>
|
||||||
|
<configuration_option name="include_path" value=".:/usr/share/php" />
|
||||||
|
</configuration_options>
|
||||||
|
<debuggers />
|
||||||
|
<loaded_extensions>
|
||||||
|
<extension name="Core" />
|
||||||
|
<extension name="FFI" />
|
||||||
|
<extension name="PDO" />
|
||||||
|
<extension name="Phar" />
|
||||||
|
<extension name="Reflection" />
|
||||||
|
<extension name="SPL" />
|
||||||
|
<extension name="SimpleXML" />
|
||||||
|
<extension name="Zend OPcache" />
|
||||||
|
<extension name="calendar" />
|
||||||
|
<extension name="ctype" />
|
||||||
|
<extension name="curl" />
|
||||||
|
<extension name="date" />
|
||||||
|
<extension name="dom" />
|
||||||
|
<extension name="exif" />
|
||||||
|
<extension name="fileinfo" />
|
||||||
|
<extension name="filter" />
|
||||||
|
<extension name="ftp" />
|
||||||
|
<extension name="gettext" />
|
||||||
|
<extension name="hash" />
|
||||||
|
<extension name="iconv" />
|
||||||
|
<extension name="json" />
|
||||||
|
<extension name="libxml" />
|
||||||
|
<extension name="mbstring" />
|
||||||
|
<extension name="openssl" />
|
||||||
|
<extension name="pcntl" />
|
||||||
|
<extension name="pcre" />
|
||||||
|
<extension name="posix" />
|
||||||
|
<extension name="readline" />
|
||||||
|
<extension name="session" />
|
||||||
|
<extension name="shmop" />
|
||||||
|
<extension name="sockets" />
|
||||||
|
<extension name="sodium" />
|
||||||
|
<extension name="standard" />
|
||||||
|
<extension name="sysvmsg" />
|
||||||
|
<extension name="sysvsem" />
|
||||||
|
<extension name="sysvshm" />
|
||||||
|
<extension name="tokenizer" />
|
||||||
|
<extension name="xml" />
|
||||||
|
<extension name="xmlreader" />
|
||||||
|
<extension name="xmlwriter" />
|
||||||
|
<extension name="xsl" />
|
||||||
|
<extension name="zip" />
|
||||||
|
<extension name="zlib" />
|
||||||
|
</loaded_extensions>
|
||||||
|
</phpinfo>
|
||||||
|
</interpreter>
|
||||||
|
</phpInfoCache>
|
||||||
|
</component>
|
||||||
|
<component name="PhpProjectSharedConfiguration" php_language_level="8.0">
|
||||||
|
<option name="suggestChangeDefaultLanguageLevel" value="false" />
|
||||||
|
</component>
|
||||||
|
<component name="PhpUnit">
|
||||||
|
<phpunit_settings>
|
||||||
|
<PhpUnitSettings custom_loader_path="$PROJECT_DIR$/vendor/autoload.php" />
|
||||||
|
</phpunit_settings>
|
||||||
|
</component>
|
||||||
|
</project>
|
|
@ -0,0 +1,47 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="WEB_MODULE" version="4">
|
||||||
|
<component name="NewModuleRootManager">
|
||||||
|
<content url="file://$MODULE_DIR$">
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/spec" isTestSource="true" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" packagePrefix="MMK2410\MyTodoList\" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/tests" isTestSource="true" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/php-timer" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/phpunit" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/php-text-template" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/php-invoker" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/php-file-iterator" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/vendor/myclabs/deep-copy" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/vendor/phpunit/php-code-coverage" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/vendor/webmozart/assert" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/vendor/phpspec/prophecy" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/vendor/nikic/php-parser" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/polyfill-ctype" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/type" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/diff" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/vendor/phpdocumentor/reflection-docblock" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/lines-of-code" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/vendor/phpdocumentor/type-resolver" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/object-enumerator" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/vendor/phpdocumentor/reflection-common" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/comparator" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/code-unit" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/cli-parser" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/vendor/theseer/tokenizer" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/exporter" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/version" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/vendor/composer" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/complexity" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/recursion-context" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/resource-operations" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/code-unit-reverse-lookup" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/global-state" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/environment" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/vendor/sebastian/object-reflector" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/vendor/phar-io/version" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/vendor/phar-io/manifest" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/vendor/doctrine/instantiator" />
|
||||||
|
</content>
|
||||||
|
<orderEntry type="inheritedJdk" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
</component>
|
||||||
|
</module>
|
|
@ -0,0 +1,6 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
|
@ -1,33 +0,0 @@
|
||||||
<?php declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace MMK2410\MyTodoList;
|
|
||||||
|
|
||||||
final class Email
|
|
||||||
{
|
|
||||||
private $email;
|
|
||||||
|
|
||||||
private function __construct(string $email)
|
|
||||||
{
|
|
||||||
$this->ensureIsValidEmail($email);
|
|
||||||
$this->email = $email;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function fromString(string $email): self
|
|
||||||
{
|
|
||||||
return new self($email);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function __toString(): string
|
|
||||||
{
|
|
||||||
return $this->email;
|
|
||||||
}
|
|
||||||
|
|
||||||
private function ensureIsValidEmail(string $email): void
|
|
||||||
{
|
|
||||||
if(!filter_var($email, FILTER_VALIDATE_EMAIL)) {
|
|
||||||
throw new \InvalidArgumentException(
|
|
||||||
sprintf("%s is not a valid email address", $email)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
<?php declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace MMK2410\MyTodoList;
|
||||||
|
|
||||||
|
class Todo
|
||||||
|
{
|
||||||
|
const ExceptionMsgInvalidTitle = "Empty task title not allowed";
|
||||||
|
|
||||||
|
private string $title;
|
||||||
|
private string $state;
|
||||||
|
|
||||||
|
public function __construct(string $title)
|
||||||
|
{
|
||||||
|
$this->validateTitle($title);
|
||||||
|
$this->title = $title;
|
||||||
|
$this->state = TodoStates::Todo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getTitle(): string
|
||||||
|
{
|
||||||
|
return $this->title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setTitle(string $title): void
|
||||||
|
{
|
||||||
|
$this->validateTitle($title);
|
||||||
|
$this->title = $title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getStatus(): string
|
||||||
|
{
|
||||||
|
return $this->state;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setState(string $state): void
|
||||||
|
{
|
||||||
|
$this->validateState($state);
|
||||||
|
$this->state = $state;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function validateTitle(string $title): void
|
||||||
|
{
|
||||||
|
if (empty($title)) {
|
||||||
|
throw new \InvalidArgumentException(self::ExceptionMsgInvalidTitle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function validateState(string $state): void
|
||||||
|
{
|
||||||
|
$reflect = new \ReflectionClass(TodoStates::class);
|
||||||
|
$constantFound = $reflect->getConstant($state);
|
||||||
|
if ($constantFound === FALSE) {
|
||||||
|
throw new \InvalidArgumentException("Invalid state tried to set.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace MMK2410\MyTodoList;
|
||||||
|
|
||||||
|
abstract class TodoStates
|
||||||
|
{
|
||||||
|
const Todo = "Todo";
|
||||||
|
const Done = "Done";
|
||||||
|
}
|
|
@ -1,27 +0,0 @@
|
||||||
<?php declare(strict_types=1);
|
|
||||||
use PHPUnit\Framework\TestCase;
|
|
||||||
use MMK2410\MyTodoList\Email;
|
|
||||||
|
|
||||||
final class EmailTest extends TestCase
|
|
||||||
{
|
|
||||||
private $email = 'user@example.com';
|
|
||||||
|
|
||||||
public function testCanBeCreatedFromValidEmailAddress(): void {
|
|
||||||
$this->assertInstanceOf(
|
|
||||||
Email::class,
|
|
||||||
Email::fromString($this->email)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testCannotBeCreatedFromInvalidEmailAddress(): void {
|
|
||||||
$this->expectException(InvalidArgumentException::class);
|
|
||||||
Email::fromString('invalid');
|
|
||||||
}
|
|
||||||
|
|
||||||
public function testCanBeUsedAsString(): void {
|
|
||||||
$this->assertEquals(
|
|
||||||
$this->email,
|
|
||||||
Email::fromString($this->email)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,67 @@
|
||||||
|
<?php declare(strict_types=1);
|
||||||
|
|
||||||
|
use MMK2410\MyTodoList\Todo;
|
||||||
|
use MMK2410\MyTodoList\TodoStates;
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
class TodoTest extends TestCase
|
||||||
|
{
|
||||||
|
public function testCreateTodo(): void
|
||||||
|
{
|
||||||
|
$title = "Some task";
|
||||||
|
$todo = new Todo($title);
|
||||||
|
$this->assertEquals(
|
||||||
|
$title,
|
||||||
|
$todo->getTitle(),
|
||||||
|
"Expected title '$title', but got '{$todo->getTitle()}'"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testDontCreateEmptyTodo(): void
|
||||||
|
{
|
||||||
|
$this->expectException(\InvalidArgumentException::class);
|
||||||
|
$this->expectExceptionMessage(Todo::ExceptionMsgInvalidTitle);
|
||||||
|
new Todo("");
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testUpdateTitle(): void
|
||||||
|
{
|
||||||
|
$anotherTitle = "Another title";
|
||||||
|
$todo = new Todo("Some title");
|
||||||
|
$todo->setTitle($anotherTitle);
|
||||||
|
$this->assertEquals(
|
||||||
|
$anotherTitle,
|
||||||
|
$todo->getTitle(),
|
||||||
|
"Expected new title $anotherTitle, but got {$todo->getTitle()}"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testNewTodoState(): void
|
||||||
|
{
|
||||||
|
$todo = new Todo("stub");
|
||||||
|
$this->assertEquals(
|
||||||
|
TodoStates::Todo,
|
||||||
|
$todo->getStatus(),
|
||||||
|
"Expected todo state 'Todo', but got {$todo->getStatus()}"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testChangeTodoState(): void
|
||||||
|
{
|
||||||
|
$todo = new Todo("stub");
|
||||||
|
$todo->setState(TodoStates::Done);
|
||||||
|
$this->assertEquals(
|
||||||
|
TodoStates::Done,
|
||||||
|
$todo->getStatus(),
|
||||||
|
"Expected todo state 'Done', but got {$todo->getStatus()}"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testSetBogusTodoState(): void
|
||||||
|
{
|
||||||
|
$todo = new Todo("stub");
|
||||||
|
$this->expectException(\InvalidArgumentException::class);
|
||||||
|
$this->expectExceptionMessage("Invalid state tried to set.");
|
||||||
|
$todo->setState("bogus");
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue