diff --git a/test/fields/EmailFieldTest.php b/test/fields/EmailFieldTest.php
new file mode 100644
index 0000000..78ecb07
--- /dev/null
+++ b/test/fields/EmailFieldTest.php
@@ -0,0 +1,87 @@
+getMockForAbstractClass(EmailField::class, ["testName"]);
+ $this->assertEquals('testName', $stub->getName());
+ $this->assertInstanceOf(EmailField::class, $stub);
+ }
+
+ /**
+ * @depends testFoundation
+ */
+ public function testBase()
+ {
+ // Generate the field
+ $field = new EmailField("testName");
+ $field->setFormName("testForm");
+
+ // Assert expected returns
+ $html = $field->generateHtml();
+ $this->assertTrue(str_starts_with($html, "assertTrue(str_ends_with($html, ">"));
+ $this->assertTrue(str_contains($html, "type='email'"));
+ $this->assertTrue(str_contains($html, "name='testName'"));
+ $this->assertTrue(str_contains($html, "id='testForm_testName'"));
+ }
+
+ /**
+ * @depends testBase
+ */
+ public function testValidator()
+ {
+ // Generate a basic field
+ $field = new EmailField("testName");
+ $field->setFormName("testForm");
+
+ // Set a value that is not an email
+ $field->setValue("totallynot#an_email");
+ $this->assertFalse($field->validate());
+ $this->assertEquals(['TestName is not a valid email address.'], $field->getErrors());
+
+ // Set a value that is valid
+ $field->setValue("name@example.com");
+ $this->assertTrue($field->validate());
+ $this->assertEmpty($field->getErrors());
+ }
+}
\ No newline at end of file
diff --git a/test/fields/TextFieldTest.php b/test/fields/TextFieldTest.php
new file mode 100644
index 0000000..d95635f
--- /dev/null
+++ b/test/fields/TextFieldTest.php
@@ -0,0 +1,172 @@
+getMockForAbstractClass(TextField::class, ["testName"]);
+ $this->assertEquals('testName', $stub->getName());
+ $this->assertInstanceOf(TextField::class, $stub);
+ }
+
+ /**
+ * @depends testFoundation
+ */
+ public function testBase()
+ {
+ // Generate the field
+ $field = new TextField("testName");
+ $field->setFormName("testForm");
+
+ // Assert expected returns
+ $html = $field->generateHtml();
+ $this->assertTrue(str_starts_with($html, "assertTrue(str_ends_with($html, ">"));
+ $this->assertTrue(str_contains($html, "type='text'"));
+ $this->assertTrue(str_contains($html, "name='testName'"));
+ $this->assertTrue(str_contains($html, "id='testForm_testName'"));
+ }
+
+ /**
+ * @depends testBase
+ */
+ public function testBlankValidate()
+ {
+ // Generate a blank TextField
+ $field = new TextField("testName");
+ $field->setFormName("testForm");
+
+ // And enter an answer
+ $field->setValue("Hello World");
+
+ // Run a validation
+ $this->assertTrue($field->validate());
+ $this->assertTrue($field->isValidated());
+ $this->assertTrue($field->isValid());
+ }
+
+ /**
+ * @depends testBlankValidate
+ */
+ public function testEmptyValidate()
+ {
+ // Generate a blank TextField
+ $field = new TextField("testName");
+ $field->setFormName("testForm");
+
+ // Run a validation
+ $this->assertFalse($field->validate());
+ $this->assertTrue($field->isValidated());
+ $this->assertFalse($field->isValid());
+
+ // And check for the empty error
+ $this->assertEquals(['TestName may not be empty.'], $field->getErrors());
+ }
+
+ /**
+ * @depends testBlankValidate
+ */
+ public function testMinMaxLength()
+ {
+ // Generate a field with a minLength and a maxLength
+ $field = new TextField("testName");
+ $field->setFormName("testForm");
+ $field->minLength(16);
+ $field->maxLength(24);
+
+ // Generate the html and verify the minlength and maxlength
+ $html = $field->generateHtml();
+ $this->assertTrue(str_contains($html, "minlength='16'"));
+ $this->assertTrue(str_contains($html, "maxlength='24'"));
+
+ // First test a value that's too short
+ $field->setValue("Hello");
+ $this->assertFalse($field->validate());
+ $this->assertEquals(['TestName must at least be 16 characters.'], $field->getErrors());
+
+ // Then test a value that's too long
+ $field->setValue("What is the meaning of life?");
+ $this->assertFalse($field->validate());
+ $this->assertEquals(['TestName exceeds maximum length of 24 characters.'], $field->getErrors());
+
+ // And test a value that is just right
+ $field->setValue("Great deal buckaroo");
+ $this->assertTrue($field->validate());
+ $this->assertEmpty($field->getErrors());
+ }
+
+ /**
+ * @depends testBlankValidate
+ */
+ public function testRegex()
+ {
+ // Generate a field with a simple regex
+ $field = new TextField("testName");
+ $field->setFormName("testForm");
+ $field->regex("[a-zA-Z]+\s+[a-zA-Z]+", "Very illegal characters!");
+
+ // First test a value which doesn't match
+ $field->setValue("Hello");
+ $this->assertFalse($field->validate());
+ $this->assertEquals(["Very illegal characters!"], $field->getErrors());
+
+ // Then test with a value which does match
+ $field->setValue("Hello World");
+ $this->assertTrue($field->validate());
+ $this->assertEmpty($field->getErrors());
+ }
+
+ /**
+ * @depends testBlankValidate
+ */
+ public function testPlaceholder()
+ {
+ // Generate a field with a placeholder
+ $field = new TextField("testName");
+ $field->setFormName("testForm");
+ $field->placeholder("Some Text");
+
+ // Generate the HTML
+ $html = $field->generateHtml();
+ $this->assertTrue(str_contains($html, "placeholder='Some Text'"));
+ }
+
+}
\ No newline at end of file