public function testDirty()
{
$m = new Model();
$m->addField('name');
$m->data = ['name' => 5];
$m['name'] = 5;
$this->assertEquals([], $m->dirty);
$m['name'] = 10;
$this->assertEquals(['name' => 5], $m->dirty);
$m['name'] = 15;
$this->assertEquals(['name' => 5], $m->dirty);
$m['name'] = 5;
$this->assertEquals([], $m->dirty);
$m['name'] = '5';
$this->assertSame(5, $m->dirty['name']);
$m['name'] = '6';
$this->assertSame(5, $m->dirty['name']);
$m['name'] = '5';
$this->assertSame(5, $m->dirty['name']);
$m['name'] = '5.0';
$this->assertSame(5, $m->dirty['name']);
$m->dirty = [];
$m->data = ['name' => ''];
$m['name'] = '';
$this->assertEquals([], $m->dirty);
$m->data = ['name' => '5'];
$m['name'] = 5;
$this->assertSame('5', $m->dirty['name']);
$m['name'] = 6;
$this->assertSame('5', $m->dirty['name']);
$m['name'] = 5;
$this->assertSame('5', $m->dirty['name']);
$m['name'] = '5';
$this->assertEquals([], $m->dirty);
$m->data = ['name' => 4.28];
$m['name'] = '4.28';
$this->assertSame(4.28, $m->dirty['name']);
$m['name'] = '5.28';
$this->assertSame(4.28, $m->dirty['name']);
$m['name'] = 4.28;
$this->assertEquals([], $m->dirty);
// now with defaults
$m = new Model();
$f = $m->addField('name', ['default' => 'John']);
$this->assertEquals('John', $f->default);
$this->assertEquals('John', $m->get('name'));
$m['name'] = null;
$this->assertEquals(['name' => 'John'], $m->dirty);
$this->assertEquals(['name' => null], $m->data);
$this->assertEquals(null, $m['name']);
unset($m['name']);
$this->assertEquals('John', $m->get('name'));
}