+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+use Test::More;
+
+plan tests => 31;
+
+use_ok('HTML::Form::Simple');
+
+my $form = HTML::Form::Simple->new;
+ok($form, 'new form');
+
+# form
+
+is(
+ $form->start,
+ '<form>',
+ 'empty start'
+);
+
+is(
+ $form->start({method => 'get', action => '', ignore => undef}),
+ '<form action="" method="get">',
+ 'start with attributes'
+);
+
+is(
+ eval { $form->start('should be a hashref') },
+ undef,
+ 'invalid attributes'
+);
+
+is(
+ $form->stop,
+ '</form>',
+ 'stop'
+);
+
+# hidden
+
+is(
+ $form->hidden,
+ '<input type="hidden">',
+ 'empty hidden'
+);
+
+is(
+ $form->hidden(foo => 'bar'),
+ '<input name="foo" type="hidden" value="bar">',
+ 'hidden'
+);
+
+#TODO: hidden options
+
+# submit
+
+is(
+ $form->submit,
+ '<input type="submit">',
+ 'empty submit'
+);
+
+is(
+ $form->submit('<OK>'),
+ '<input type="submit" value="<OK>">',
+ 'submit value'
+);
+
+is(
+ $form->submit({disabled => 1, id => 'test', type => 'button'}),
+ '<input disabled id="test" type="button">',
+ 'submit attributes'
+);
+
+is(
+ $form->submit('<OK>', {type => '', value => 'override', id => ''}),
+ '<input value="<OK>">',
+ 'submit overrides'
+);
+
+# input
+
+is(
+ $form->input,
+ '<input type="text">',
+ 'empty input'
+);
+
+is(
+ $form->input(undef, undef, undef),
+ '<input type="text">',
+ 'explicit empty input'
+);
+
+is(
+ $form->input('test'),
+ '<input id="test" name="test" type="text">',
+ 'input with name'
+);
+
+is(
+ $form->input(undef, 'test'),
+ '<input type="text" value="test">',
+ 'input with value'
+);
+
+is(
+ $form->input(undef, {value => 'test'}),
+ '<input type="text" value="test">',
+ 'input with attribute value'
+);
+
+is(
+ $form->input({name => 'test', value => ''}),
+ '<input id="test" name="test" type="text" value="">',
+ 'input with only attributes'
+);
+
+is(
+ $form->input('', '', {disabled => 0, something => undef}),
+ '<input name="" type="text" value="">',
+ 'input with empty attributes'
+);
+
+is(
+ $form->input(undef, undef, {name => 'override', value => 'override'}),
+ '<input type="text">',
+ 'ignore input overrides'
+);
+
+is(
+ $form->input('name', {id => ''}),
+ '<input name="name" type="text">',
+ 'input with id override'
+);
+
+is(
+ $form->input('<">', '<">', {id => '>"<'}),
+ '<input id=">"<" name="<">" type="text" value="<">">',
+ 'input quoting'
+);
+
+is(
+ $form->input(undef, {disabled => 'something'}),
+ '<input disabled type="text">',
+ 'disabled input'
+);
+
+is(
+ $form->input({type => 'password'}),
+ '<input type="password">',
+ 'password'
+);
+
+# textarea
+
+is(
+ $form->input({rows => 0}),
+ '<textarea rows="0"></textarea>',
+ 'minimal textarea'
+);
+
+is(
+ $form->input(foo => 'bar', {cols => 42, rows => 1, disabled => 1}),
+ '<textarea disabled cols="42" id="foo" name="foo" rows="1">bar</textarea>',
+ 'textarea'
+);
+
+is(
+ $form->input(undef, qq{<foo>&bl'a"\n .}, {cols => undef, rows => '<">'}),
+ qq{<textarea rows="<">"><foo>&bl'a"\n .</textarea>},
+ 'textarea quoting'
+);
+
+# select
+
+is(
+ $form->select,
+ '<select></select>', # malformed html: at least 1 option required
+ 'empty select'
+);
+
+is(
+ $form->select(undef, [], '', {name => ''}),
+ '<select></select>',
+ 'explicit empty select'
+);
+
+is(
+ $form->select(undef, [undef]),
+ '<select><option></select>',
+ 'minimal select'
+);
+
+is(
+ $form->select(foo => [1..2]),
+ '<select name="foo"><option value="1"><option value="2"></select>',
+ 'select contents'
+);
+
+#TODO
+