formhelper 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README +0 -0
- data/README.rdoc +24 -0
- data/test/boolean_test.rb +10 -0
- data/test/currency_test.rb +9 -0
- data/test/date_answer_test.rb +10 -0
- data/test/descriptive_content_test.rb +14 -0
- data/test/field_test.rb +19 -0
- data/test/form_test.rb +166 -0
- data/test/image_data_test.rb +18 -0
- data/test/init.rb +2 -0
- data/test/lib/factoryform.rb +25 -0
- data/test/lib/factoryform/boolean.rb +17 -0
- data/test/lib/factoryform/currency.rb +7 -0
- data/test/lib/factoryform/date_answer.rb +10 -0
- data/test/lib/factoryform/descriptive_content.rb +17 -0
- data/test/lib/factoryform/email.rb +11 -0
- data/test/lib/factoryform/field.rb +29 -0
- data/test/lib/factoryform/form.rb +127 -0
- data/test/lib/factoryform/image_data.rb +13 -0
- data/test/lib/factoryform/long_answer.rb +12 -0
- data/test/lib/factoryform/multiple_choice.rb +39 -0
- data/test/lib/factoryform/number.rb +11 -0
- data/test/lib/factoryform/rating.rb +23 -0
- data/test/lib/factoryform/short_answer.rb +11 -0
- data/test/lib/factoryform/text_data.rb +11 -0
- data/test/lib/factoryform/time_answer.rb +11 -0
- data/test/lib/factoryform/url.rb +10 -0
- data/test/lib/factoryform/utils.rb +13 -0
- data/test/long_answer_test.rb +54 -0
- data/test/multiple_choice_test.rb +61 -0
- data/test/number_test.rb +11 -0
- data/test/rating_test.rb +21 -0
- data/test/short_answer_test.rb +83 -0
- data/test/test_helper.rb +2 -0
- data/test/text_data_test.rb +17 -0
- data/test/time_answer_test.rb +10 -0
- data/test/url_test.rb +11 -0
- metadata +169 -0
data/README
ADDED
File without changes
|
data/README.rdoc
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
= formhelper
|
2
|
+
This is a library to create different form field elements, allows form object to parse into different formats (YAML, JSON, XML)
|
3
|
+
|
4
|
+
= INSTALLATION
|
5
|
+
sudo gem install formhelper
|
6
|
+
|
7
|
+
= BASIC USAGE
|
8
|
+
require 'rubygems'
|
9
|
+
require 'formhelper'
|
10
|
+
|
11
|
+
# Create a form object
|
12
|
+
form = FormHelper::Form.new()
|
13
|
+
|
14
|
+
# Create short answer and long answer objects
|
15
|
+
sa = FormHelper::ShortAnswer.new(:id => "email_1",:label => "Personal email address" )
|
16
|
+
la = FormHelper::LongAnswer.new(:id => "comment_1",:label => "Provide your comments below")
|
17
|
+
|
18
|
+
# Add short answer and long answer objects
|
19
|
+
form.add(sa)
|
20
|
+
form.add(la)
|
21
|
+
|
22
|
+
# Returns YAML format of form
|
23
|
+
form.to_yml
|
24
|
+
=>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class BooleanTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_should_create_boolean_answer_field
|
6
|
+
bool = FactoryForm::Boolean.new(:id => "fav-color", :label => "Choose your favourite color")
|
7
|
+
assert_equal [true, false], bool.values
|
8
|
+
end
|
9
|
+
|
10
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class DateAnswerTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_should_create_date_answer_field
|
6
|
+
date = FactoryForm::DateAnswer.new(:id => "date_1", :label => "Give date of establishment")
|
7
|
+
assert_equal "date", date.validation_format
|
8
|
+
end
|
9
|
+
|
10
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class DescriptiveContentTest < Test::Unit::TestCase
|
4
|
+
def test_should_create_descriptive_content_field_with_minimum_params_passed
|
5
|
+
dc = FactoryForm::DescriptiveContent.new(:id => "field_3", :label => "Personal email address")
|
6
|
+
assert_equal "Personal email address",dc.label
|
7
|
+
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_should_raise_exception_unless_required_params_passed
|
11
|
+
# Raise expected argument exception as ID,label are required
|
12
|
+
assert_raise(FactoryForm::ParameterExpectedException){ FactoryForm::DescriptiveContent.new() }
|
13
|
+
end
|
14
|
+
end
|
data/test/field_test.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class FieldTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_should_check_of_having_validation
|
6
|
+
sa1 = FactoryForm::ShortAnswer.new(:id => "email_1", :label => "Personal email address")
|
7
|
+
la1 = FactoryForm::LongAnswer.new(:id => "comments", :label => "Provide your comments below")
|
8
|
+
|
9
|
+
# By default, no validation for different formats unless explicitly specified
|
10
|
+
assert_equal "general",sa1.validation_format
|
11
|
+
|
12
|
+
# By default, answer for this field is optional unless explicitly specified as required
|
13
|
+
assert_equal true,sa1.required
|
14
|
+
|
15
|
+
# By default, no uniqueness of answer for this field unless explicitly specified as unique
|
16
|
+
assert_equal false,sa1.unique
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
data/test/form_test.rb
ADDED
@@ -0,0 +1,166 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class FormTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_should_create_form
|
6
|
+
# Create short answer and long answer objects
|
7
|
+
sa = FactoryForm::ShortAnswer.new(:id => "email_1",:label => "Personal email address" )
|
8
|
+
la = FactoryForm::LongAnswer.new(:id => "comment_1",:label => "Provide your comments below")
|
9
|
+
form = FactoryForm::Form.new()
|
10
|
+
|
11
|
+
# Add short answer and long answer objects
|
12
|
+
form.add(sa)
|
13
|
+
form.add(la)
|
14
|
+
|
15
|
+
assert_equal 2,form.fields.length
|
16
|
+
|
17
|
+
# Create form object with title
|
18
|
+
form2 = FactoryForm::Form.new({:title => "Data collection"})
|
19
|
+
assert_equal "Data collection", form2.title
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_should_list_all_the_fields
|
24
|
+
sa = FactoryForm::ShortAnswer.new(:id => "url_1",:label => "Personal web address",
|
25
|
+
:options => {
|
26
|
+
:hint => "It should be his/her personal web address",
|
27
|
+
:validation_format => "url",
|
28
|
+
:required => true,
|
29
|
+
:unique => false
|
30
|
+
}
|
31
|
+
)
|
32
|
+
|
33
|
+
la = FactoryForm::LongAnswer.new(:id => "comment_1",:label => "Provide your comments below",
|
34
|
+
:options => {
|
35
|
+
:hint => "Up to a maximum of 250 characters",
|
36
|
+
:required => false,
|
37
|
+
:unique => true,
|
38
|
+
:min_chars => 50,
|
39
|
+
:rows => 6,
|
40
|
+
:cols => 5
|
41
|
+
}
|
42
|
+
)
|
43
|
+
form = FactoryForm::Form.new()
|
44
|
+
form.add(sa)
|
45
|
+
form.add(la)
|
46
|
+
|
47
|
+
# Get the list of all fields in the form
|
48
|
+
list = form.fields
|
49
|
+
|
50
|
+
assert_equal true,list.first.required
|
51
|
+
assert_equal "url", list.first.validation_format
|
52
|
+
|
53
|
+
assert_equal true,list.last.required
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_should_get_field
|
58
|
+
form = create_form
|
59
|
+
assert_equal 3, form.fields.length
|
60
|
+
|
61
|
+
# Get email field
|
62
|
+
field_to_delete = form.get(:id => "email_1")
|
63
|
+
assert_instance_of FactoryForm::ShortAnswer,field_to_delete
|
64
|
+
|
65
|
+
# Delete email field
|
66
|
+
form.remove(field_to_delete)
|
67
|
+
|
68
|
+
assert_equal 2, form.fields.length
|
69
|
+
assert_instance_of FactoryForm::LongAnswer, form.fields.first
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_should_re_order_fields
|
74
|
+
form = create_form
|
75
|
+
field1 = form.get(:id => "email_1")
|
76
|
+
field2 = form.get(:id => "comment_1")
|
77
|
+
field3 = form.get(:id => "name_1")
|
78
|
+
|
79
|
+
assert_equal 0,form.fields.index(field1)
|
80
|
+
assert_equal 1,form.fields.index(field2)
|
81
|
+
|
82
|
+
# Move email field down
|
83
|
+
form.move_down(field1)
|
84
|
+
|
85
|
+
assert_equal 1,form.fields.index(field1)
|
86
|
+
assert_equal 0,form.fields.index(field2)
|
87
|
+
|
88
|
+
# Move comment field up
|
89
|
+
form.move_up(field3)
|
90
|
+
|
91
|
+
assert_equal 0,form.fields.index(field2)
|
92
|
+
assert_equal 1,form.fields.index(field3)
|
93
|
+
assert_equal 2,form.fields.index(field1)
|
94
|
+
|
95
|
+
end
|
96
|
+
|
97
|
+
def test_should_change_to_yml
|
98
|
+
form = create_form
|
99
|
+
changed_yml = form.to_yml
|
100
|
+
# TODO: FIND BETTER WAY FOR TESTING .yml CONTENT-TYPE
|
101
|
+
assert_kind_of(String, changed_yml)
|
102
|
+
|
103
|
+
# Create short answer and long answer objects
|
104
|
+
sa = FactoryForm::ShortAnswer.new(:id => "email_1",:label => "Personal email address" )
|
105
|
+
la = FactoryForm::LongAnswer.new(:id => "comment_1",:label => "Provide your comments below")
|
106
|
+
td = FactoryForm::TextData.new(:id => "name_1", :label => "Person's name")
|
107
|
+
img = FactoryForm::ImageData.new(:id => "photo_1", :label => "Photo of person")
|
108
|
+
form = FactoryForm::Form.new(:title => "Survey form")
|
109
|
+
|
110
|
+
# Add short answer and long answer objects
|
111
|
+
form.add(sa)
|
112
|
+
form.add(la)
|
113
|
+
form.add(td)
|
114
|
+
form.add(img)
|
115
|
+
assert_instance_of FactoryForm::ImageData, form.fields.last
|
116
|
+
|
117
|
+
|
118
|
+
end
|
119
|
+
|
120
|
+
def test_should_change_position_in_yml_string
|
121
|
+
form = create_form
|
122
|
+
field1 = form.get(:id => "email_1")
|
123
|
+
field2 = form.get(:id => "comment_1")
|
124
|
+
changed_yml = form.to_yml
|
125
|
+
|
126
|
+
# Convert to hash for making sure that yaml string is also changed
|
127
|
+
before_hash = YAML::load(changed_yml)
|
128
|
+
assert_instance_of FactoryForm::ShortAnswer, before_hash.fields.first
|
129
|
+
|
130
|
+
# Move email field down
|
131
|
+
form.move_down(field1)
|
132
|
+
after_hash = YAML::load(form.to_yml)
|
133
|
+
assert_instance_of FactoryForm::LongAnswer, after_hash.fields.first
|
134
|
+
|
135
|
+
form.add(FactoryForm::TextData.new(:id => "my-name", :label => "my name"))
|
136
|
+
assert_instance_of FactoryForm::TextData, after_hash.fields.last
|
137
|
+
|
138
|
+
end
|
139
|
+
|
140
|
+
def test_should_change_to_xml
|
141
|
+
form = create_form
|
142
|
+
changed_xml = form.to_xml
|
143
|
+
# TODO: FIND BETTER WAY FOR TESTING .xml CONTENT-TYPE
|
144
|
+
assert_kind_of(String, changed_xml)
|
145
|
+
end
|
146
|
+
|
147
|
+
def test_should_change_to_json
|
148
|
+
form = create_form
|
149
|
+
changed_json = form.to_json
|
150
|
+
|
151
|
+
# TODO: FIND BETTER WAY FOR TESTING json CONTENT-TYPE
|
152
|
+
assert_kind_of(String, changed_json)
|
153
|
+
end
|
154
|
+
|
155
|
+
private
|
156
|
+
def create_form
|
157
|
+
sa = FactoryForm::ShortAnswer.new(:id => "email_1", :label => "Personal email address" )
|
158
|
+
la = FactoryForm::LongAnswer.new(:id => "comment_1", :label => "Provide your comments below")
|
159
|
+
td = FactoryForm::TextData.new(:id => "name_1", :label => "Person's name")
|
160
|
+
form = FactoryForm::Form.new()
|
161
|
+
form.add(sa)
|
162
|
+
form.add(la)
|
163
|
+
form.add(td)
|
164
|
+
return form
|
165
|
+
end
|
166
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ImageDataTest < Test::Unit::TestCase
|
4
|
+
def test_should_create_image_data_field_with_minimum_params_passed
|
5
|
+
td = FactoryForm::ImageData.new(:id => "photo_1", :label => "Photo of child")
|
6
|
+
assert_equal "Photo of child",td.label
|
7
|
+
|
8
|
+
# By default alt attribute is same as field id
|
9
|
+
assert_equal "Photo of child",td.alt
|
10
|
+
assert_equal "image_data",td.field_type
|
11
|
+
assert_equal true,td.required
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_should_raise_exception_unless_required_params_passed
|
15
|
+
# Raise expected argument exception as ID,label are required
|
16
|
+
assert_raise(FactoryForm::ParameterExpectedException){ FactoryForm::ImageData.new() }
|
17
|
+
end
|
18
|
+
end
|
data/test/init.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__),'formhelper/form')
|
2
|
+
require File.join(File.dirname(__FILE__),'formhelper/field')
|
3
|
+
require File.join(File.dirname(__FILE__),'formhelper/short_answer')
|
4
|
+
require File.join(File.dirname(__FILE__),'formhelper/long_answer')
|
5
|
+
require File.join(File.dirname(__FILE__),'formhelper/multiple_choice')
|
6
|
+
require File.join(File.dirname(__FILE__),'formhelper/utils')
|
7
|
+
require File.join(File.dirname(__FILE__),'formhelper/text_data')
|
8
|
+
require File.join(File.dirname(__FILE__),'formhelper/image_data')
|
9
|
+
require File.join(File.dirname(__FILE__),'formhelper/date_answer')
|
10
|
+
require File.join(File.dirname(__FILE__),'formhelper/email')
|
11
|
+
require File.join(File.dirname(__FILE__),'formhelper/number')
|
12
|
+
require File.join(File.dirname(__FILE__),'formhelper/url')
|
13
|
+
require File.join(File.dirname(__FILE__),'formhelper/time_answer')
|
14
|
+
require File.join(File.dirname(__FILE__),'formhelper/boolean')
|
15
|
+
require File.join(File.dirname(__FILE__),'formhelper/currency')
|
16
|
+
require File.join(File.dirname(__FILE__),'formhelper/rating')
|
17
|
+
require File.join(File.dirname(__FILE__),'formhelper/descriptive_content')
|
18
|
+
|
19
|
+
|
20
|
+
module FactoryForm
|
21
|
+
# Raised when FactoryForm::TextData.new doesn't include a required parameter
|
22
|
+
class ParameterExpectedException < RuntimeError
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module FactoryForm
|
2
|
+
class Boolean < Field
|
3
|
+
attr_accessor :values # True/false values
|
4
|
+
|
5
|
+
def initialize(options={})
|
6
|
+
self.values = options[:values] = [true, false]
|
7
|
+
options[:field_type] = "boolean"
|
8
|
+
|
9
|
+
super(options)
|
10
|
+
|
11
|
+
# Unique is always false
|
12
|
+
self.unique = false
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module FactoryForm
|
2
|
+
class DescriptiveContent
|
3
|
+
attr_reader :id
|
4
|
+
attr_accessor :label, :value
|
5
|
+
|
6
|
+
def initialize(options = {})
|
7
|
+
unless options.empty? || options[:id].empty? || options[:label].empty?
|
8
|
+
@id, @label, @value = options[:id], options[:label], options[:value] || options[:label]
|
9
|
+
else
|
10
|
+
raise(ParameterExpectedException, "Missing ID and label")
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module FactoryForm
|
2
|
+
# Field is simply a hash of different attributes
|
3
|
+
class Field
|
4
|
+
attr_reader :id
|
5
|
+
attr_accessor :label, :hint, :required, :unique, :validation_format, :field_type
|
6
|
+
|
7
|
+
def initialize(options)
|
8
|
+
unless options.nil? || options[:id].nil? || options[:label].nil?
|
9
|
+
extra_options = options[:options] || { }
|
10
|
+
extra_options.merge!({
|
11
|
+
# defaults
|
12
|
+
:hint => extra_options[:hint] || " ",
|
13
|
+
:required => extra_options[:required] || true,
|
14
|
+
:unique => extra_options[:unique] || false,
|
15
|
+
:validation_format => extra_options[:validation_format] || "general",
|
16
|
+
})
|
17
|
+
options.merge!({:options => extra_options})
|
18
|
+
|
19
|
+
@id, @label, @hint, @required, @unique, @validation_format, @field_type = options[:id], options[:label],options[:options][:hint], options[:options][:required], options[:options][:unique], options[:options][:validation_format], options[:field_type]
|
20
|
+
else
|
21
|
+
raise(ParameterExpectedException, "Missing ID and label")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
|
29
|
+
|
@@ -0,0 +1,127 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
require 'rubygems'
|
3
|
+
require 'json/pure'
|
4
|
+
require File.join(File.dirname(__FILE__),'utils')
|
5
|
+
require 'rexml/document'
|
6
|
+
|
7
|
+
module FactoryForm
|
8
|
+
# Form is simply an ordered array of fields. Each Field is simply a hash of field options.
|
9
|
+
class Form
|
10
|
+
attr_accessor :title, :fields
|
11
|
+
|
12
|
+
def initialize(options = {})
|
13
|
+
@title = options[:title] || ""
|
14
|
+
@fields = Array.new
|
15
|
+
end
|
16
|
+
|
17
|
+
# Add field object
|
18
|
+
def add(field, position=@fields.length)
|
19
|
+
# Check for duplicate ID
|
20
|
+
unless get_ids.include?(field.id)
|
21
|
+
@fields.insert(position, field)
|
22
|
+
else
|
23
|
+
raise(DuplicateIDException, "Duplicate ID")
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
# Get field object by ID
|
29
|
+
# form.get(:id => "email_1")
|
30
|
+
# TODO:: Get element by other attributes as well
|
31
|
+
def get(option)
|
32
|
+
# @fields[@fields.index(option)]
|
33
|
+
@fields[get_ids.index(option[:id])]
|
34
|
+
end
|
35
|
+
|
36
|
+
# Remove field object
|
37
|
+
def remove(field)
|
38
|
+
@fields.delete(field)
|
39
|
+
end
|
40
|
+
|
41
|
+
def move_up(field, steps = 1)
|
42
|
+
@fields.move_object(field, @fields.index(field) - steps)
|
43
|
+
end
|
44
|
+
|
45
|
+
def move_down(field, steps = 1)
|
46
|
+
@fields.move_object(field, @fields.index(field) + steps)
|
47
|
+
end
|
48
|
+
|
49
|
+
def move_to_position(field, position)
|
50
|
+
@fields.move_object(field, position)
|
51
|
+
end
|
52
|
+
|
53
|
+
def add_to_position(field, position)
|
54
|
+
@fields.insert(position, field)
|
55
|
+
end
|
56
|
+
|
57
|
+
def to_yml
|
58
|
+
self.to_yaml
|
59
|
+
end
|
60
|
+
|
61
|
+
def to_json
|
62
|
+
fields = Array.new
|
63
|
+
@fields.each do |f|
|
64
|
+
attributes = f.instance_variables.map{|a| a.gsub("@","")}
|
65
|
+
attributes_hash = {}
|
66
|
+
attributes.each do |a|
|
67
|
+
attributes_hash[a] = f.send(a)
|
68
|
+
end
|
69
|
+
fields << {f.class.name => attributes_hash }
|
70
|
+
end
|
71
|
+
fields
|
72
|
+
fields.to_json
|
73
|
+
end
|
74
|
+
|
75
|
+
def to_xml
|
76
|
+
doc = REXML::Document.new
|
77
|
+
root = doc.add_element("Form")
|
78
|
+
|
79
|
+
title_element = root.add_element("Title")
|
80
|
+
title_element.add_text("#{self.title}")
|
81
|
+
|
82
|
+
out_string = ''
|
83
|
+
@fields.each {|field|
|
84
|
+
field_element = root.add_element("Field")
|
85
|
+
field_type_element = field_element.add_element("#{field.class.name}")
|
86
|
+
|
87
|
+
field_type_element.add_attribute("id", field.id)
|
88
|
+
field_type_element.add_attribute("label", field.label)
|
89
|
+
|
90
|
+
attributes = field.instance_variables.map{|a| a.gsub("@","")}
|
91
|
+
attributes.each do |attrb|
|
92
|
+
attrb_element = field_type_element.add_element("#{attrb}")
|
93
|
+
|
94
|
+
# For option values of Multiple choice, separate them as option tags
|
95
|
+
if attrb == "values"
|
96
|
+
field.send(attrb).each do |option|
|
97
|
+
option_element = attrb_element.add_element("option")
|
98
|
+
option_element.add_text(option)
|
99
|
+
end
|
100
|
+
else
|
101
|
+
attrb_element.add_text(field.send(attrb).to_s)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
doc.write( out_string = "\n"+'<?xml version="1.0" encoding="UTF-8"?>'+"\n", 2 )
|
106
|
+
|
107
|
+
}
|
108
|
+
return out_string
|
109
|
+
end
|
110
|
+
|
111
|
+
private
|
112
|
+
|
113
|
+
# List of all IDs
|
114
|
+
def get_ids
|
115
|
+
@fields.map(& :id)
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
119
|
+
|
120
|
+
# Raised if the field with the same ID already exists
|
121
|
+
class DuplicateIDException < RuntimeError
|
122
|
+
|
123
|
+
end
|
124
|
+
|
125
|
+
end
|
126
|
+
|
127
|
+
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module FactoryForm
|
2
|
+
class ImageData < Field
|
3
|
+
attr_accessor :alt, :url
|
4
|
+
|
5
|
+
def initialize(options = {})
|
6
|
+
options[:field_type] = "image_data"
|
7
|
+
@url = options[:url] || options[:label]
|
8
|
+
@alt = options[:alt] || options[:label]
|
9
|
+
super(options)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module FactoryForm
|
2
|
+
class LongAnswer < Field
|
3
|
+
attr_accessor :min_chars
|
4
|
+
def initialize(options={})
|
5
|
+
options[:field_type] = "long_answer"
|
6
|
+
super(options)
|
7
|
+
@min_chars = options[:options][:min_chars] || 500 # Default number of chars 500
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module FactoryForm
|
2
|
+
class MultipleChoice < Field
|
3
|
+
attr_accessor :values # Option values
|
4
|
+
# attr_accessor :type # select_box, check_box, radio_button(:default)
|
5
|
+
FIELD_TYPE = ["select_box", "check_box", "radio_button"]
|
6
|
+
|
7
|
+
def initialize(options={})
|
8
|
+
options[:field_type] ||= "radio_button"
|
9
|
+
super(options)
|
10
|
+
|
11
|
+
# Unique is always false
|
12
|
+
@unique = false
|
13
|
+
|
14
|
+
if options[:values] && options[:values].length > 1
|
15
|
+
@values = options[:values]
|
16
|
+
else
|
17
|
+
raise(ParameterExpectedException, "Missing option values (at least two)")
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
check_field_type
|
22
|
+
end
|
23
|
+
|
24
|
+
def add_option(value)
|
25
|
+
@values.push(value)
|
26
|
+
end
|
27
|
+
|
28
|
+
def remove_option(value)
|
29
|
+
@values.delete(value)
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
def check_field_type
|
34
|
+
raise(ArgumentError, "Invalid Field Type, Expected one of select_box, check_box, radio_button") if !FIELD_TYPE.include?(@field_type)
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module FactoryForm
|
2
|
+
# Rating has different scales
|
3
|
+
class Rating < Field
|
4
|
+
attr_accessor :scale, :from_label, :to_label
|
5
|
+
|
6
|
+
def initialize(options={})
|
7
|
+
options[:field_type] = "rating"
|
8
|
+
super(options)
|
9
|
+
|
10
|
+
# Default is 2 for number of scales
|
11
|
+
if options[:scale] && options[:scale].to_i > 1
|
12
|
+
self.scale = options[:scale].to_i
|
13
|
+
else
|
14
|
+
raise(ParameterExpectedException, "Missing rating scale (should be greater than or equal to 2)")
|
15
|
+
end
|
16
|
+
|
17
|
+
self.from_label = options[:from_label] || ""
|
18
|
+
self.to_label = options[:to_label] || ""
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class LongAnswerTest < Test::Unit::TestCase
|
4
|
+
def test_should_create_long_answer_field
|
5
|
+
la = FactoryForm::LongAnswer.new(:id => "comments", :label => "Provide your comments below")
|
6
|
+
|
7
|
+
# Long answer text should not have any validation format
|
8
|
+
assert_equal "general", la.validation_format
|
9
|
+
|
10
|
+
la.hint = "Up to a maximum of 250 characters"
|
11
|
+
assert_equal "Up to a maximum of 250 characters", la.hint
|
12
|
+
|
13
|
+
# By default, answer for this field is optional unless explicitly specified as required
|
14
|
+
assert_equal true,la.required
|
15
|
+
|
16
|
+
# By default, no uniqueness of answer for this field unless explicitly specified as unique
|
17
|
+
assert_equal false,la.unique
|
18
|
+
|
19
|
+
# Set answer for this field as required
|
20
|
+
la.required = true
|
21
|
+
|
22
|
+
# Set answer for this field to be unique
|
23
|
+
la.unique = true
|
24
|
+
|
25
|
+
# Should have required attribute to be true
|
26
|
+
assert_equal true, la.required
|
27
|
+
|
28
|
+
# Should have unique answers
|
29
|
+
assert_equal true, la.unique
|
30
|
+
|
31
|
+
# Should have 500 min_chars
|
32
|
+
assert_equal 500, la.min_chars
|
33
|
+
|
34
|
+
# Pass min_chars
|
35
|
+
la2 = FactoryForm::LongAnswer.new(:id => "comments", :label => "Provide your comments below", :options => {:min_chars => 700 })
|
36
|
+
assert_equal 700, la2.min_chars
|
37
|
+
|
38
|
+
# Field type
|
39
|
+
assert_equal "long_answer", la.field_type
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_should_not_create_long_answer_field_if_ID_label_are_missing
|
44
|
+
# Raise expected argument exception as ID,label are required
|
45
|
+
assert_raise(FactoryForm::ParameterExpectedException){ FactoryForm::LongAnswer.new() }
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_should_set_minimum_number_of_characters
|
49
|
+
la = FactoryForm::LongAnswer.new(:id => "comments", :label => "Provide your comments below")
|
50
|
+
la.min_chars = 500
|
51
|
+
assert_equal 500,la.min_chars
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class MultipleChoiceTest < Test::Unit::TestCase
|
4
|
+
def test_should_create_multiple_choice_answer_field
|
5
|
+
|
6
|
+
# Multiple choice should have value attributes passed as well
|
7
|
+
assert_raise(FactoryForm::ParameterExpectedException){ FactoryForm::MultipleChoice.new(:id => "fav-color", :label => "Choose your favourite color") }
|
8
|
+
|
9
|
+
mc = FactoryForm::MultipleChoice.new(:id => "fav-color", :label => "Choose your favourite color",
|
10
|
+
:values => ["Red color","Green color"]
|
11
|
+
)
|
12
|
+
|
13
|
+
# There should be at least two values for this field
|
14
|
+
assert_raise(FactoryForm::ParameterExpectedException){ FactoryForm::MultipleChoice.new(:id => "fav-color", :label => "Choose your favourite color") }
|
15
|
+
assert_equal 2, mc.values.length
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_should_add_remove_new_option
|
20
|
+
mc = FactoryForm::MultipleChoice.new(:id => "fav-color", :label => "Choose your favourite color",
|
21
|
+
:values => ["Red color","Green color"]
|
22
|
+
)
|
23
|
+
assert_equal "Green color", mc.values.last
|
24
|
+
assert_equal 2, mc.values.length
|
25
|
+
|
26
|
+
# Add other option values
|
27
|
+
mc.add_option("Blue Color")
|
28
|
+
assert_equal "Blue Color", mc.values.last
|
29
|
+
assert_equal 3, mc.values.length
|
30
|
+
|
31
|
+
mc.remove_option("Blue Color")
|
32
|
+
assert_equal 2, mc.values.length
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_should_support_different_field_types
|
37
|
+
mc = FactoryForm::MultipleChoice.new(:id => "fav-color", :label => "Choose your favourite color",
|
38
|
+
:values => ["Red color","Green color"]
|
39
|
+
)
|
40
|
+
assert_equal "radio_button", mc.field_type
|
41
|
+
|
42
|
+
mc = FactoryForm::MultipleChoice.new(:id => "fav-color", :label => "Choose your favourite color",
|
43
|
+
:values => ["Red color","Green color"],
|
44
|
+
:field_type => "check_box"
|
45
|
+
)
|
46
|
+
assert_equal "check_box", mc.field_type
|
47
|
+
|
48
|
+
# Should not allow field types other than "select_box", "check_box", "radio_button"
|
49
|
+
assert_raise(ArgumentError){ FactoryForm::MultipleChoice.new(:id => "fav-color", :label => "Choose your favourite color",
|
50
|
+
:values => ["Red color","Green color"],
|
51
|
+
:field_type => "list"
|
52
|
+
)
|
53
|
+
}
|
54
|
+
|
55
|
+
# Change field type to select_box
|
56
|
+
mc.field_type = "select_box"
|
57
|
+
assert_equal "select_box", mc.field_type
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
data/test/number_test.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class NumberTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_should_create_number_answer_field
|
6
|
+
number = FactoryForm::Number.new(:id => "number_1", :label => "Give phone number")
|
7
|
+
assert_equal "number", number.validation_format
|
8
|
+
assert_equal "short_answer", number.field_type
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
data/test/rating_test.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class RatingTest < Test::Unit::TestCase
|
4
|
+
def test_should_create_rating_answer_field
|
5
|
+
|
6
|
+
# Rating answer field should have scale attributes passed as well
|
7
|
+
assert_raise(FactoryForm::ParameterExpectedException){ FactoryForm::Rating.new(:id => "rating_1", :label => "Choose your ranking" ) }
|
8
|
+
|
9
|
+
# Create rating answer field providing scales
|
10
|
+
rating = FactoryForm::Rating.new(:id => "rating_1", :label => "Choose your ranking" , :scale => "5" )
|
11
|
+
assert_equal 5, rating.scale
|
12
|
+
assert_equal "", rating.from_label
|
13
|
+
|
14
|
+
# Create rating answer field providing from and to label
|
15
|
+
rating = FactoryForm::Rating.new(:id => "rating_1", :label => "How would you rank this website, on the basis of easiness of UI ?" , :scale => 5, :from_label => "bad", :to_label => "good" )
|
16
|
+
assert_equal "bad", rating.from_label
|
17
|
+
assert_equal "good", rating.to_label
|
18
|
+
assert_equal "rating", rating.field_type
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ShortAnswerTest < Test::Unit::TestCase
|
4
|
+
def test_should_create_short_answer_field_with_minimum_params_passed
|
5
|
+
sa1 = FactoryForm::ShortAnswer.new(:id => "email_1", :label => "Personal email address")
|
6
|
+
|
7
|
+
# By default, no validation for different formats unless explicitly specified
|
8
|
+
assert_equal "general",sa1.validation_format
|
9
|
+
|
10
|
+
# By default, answer for this field is optional unless explicitly specified as required
|
11
|
+
assert_equal true,sa1.required
|
12
|
+
|
13
|
+
# By default, no uniqueness of answer for this field unless explicitly specified as unique
|
14
|
+
assert_equal false,sa1.unique
|
15
|
+
|
16
|
+
# Set validation format as email
|
17
|
+
sa1.validation_format = "email"
|
18
|
+
|
19
|
+
# Should have email format as validation_format
|
20
|
+
assert_equal "email", sa1.validation_format
|
21
|
+
|
22
|
+
# Set answer for this field as required
|
23
|
+
sa1.required = true
|
24
|
+
|
25
|
+
# Set answer for this field to be unique
|
26
|
+
sa1.unique = true
|
27
|
+
|
28
|
+
# Should have required attribute to be true
|
29
|
+
assert_equal true, sa1.required
|
30
|
+
|
31
|
+
# Should have unique answers
|
32
|
+
assert_equal true, sa1.unique
|
33
|
+
|
34
|
+
assert_equal "short_answer", sa1.field_type
|
35
|
+
|
36
|
+
|
37
|
+
sa1.hint = "It should be his/her personal email address, not his official address."
|
38
|
+
assert_equal "It should be his/her personal email address, not his official address.", sa1.hint
|
39
|
+
|
40
|
+
# Ensures object of this class
|
41
|
+
assert_instance_of FactoryForm::ShortAnswer, sa1
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_should_create_short_answer_field_with_all_other_optional_params
|
46
|
+
sa = FactoryForm::ShortAnswer.new(:id => "url_1", :label => "Personal web address",
|
47
|
+
:options => {
|
48
|
+
:hint => "It should be his/her personal web address",
|
49
|
+
:validation_format => "url",
|
50
|
+
:required => true,
|
51
|
+
:unique => false
|
52
|
+
}
|
53
|
+
)
|
54
|
+
assert_equal "url_1", sa.id
|
55
|
+
assert_equal "Personal web address", sa.label
|
56
|
+
assert_equal "It should be his/her personal web address", sa.hint
|
57
|
+
assert_equal "url", sa.validation_format
|
58
|
+
assert_equal true, sa.required
|
59
|
+
assert_equal false, sa.unique
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_should_not_create_short_answer_field_if_required_params_are_missing
|
64
|
+
# Raise expected argument exception as ID,label are required
|
65
|
+
assert_raise(FactoryForm::ParameterExpectedException){ FactoryForm::ShortAnswer.new() }
|
66
|
+
end
|
67
|
+
|
68
|
+
def test_should_not_raise_exception_for_valid_params_passed
|
69
|
+
assert_nothing_raised(Exception){ FactoryForm::ShortAnswer.new(:id => "phone_number", :label => "Phone Number") }
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_should_raise_exception_if_duplicate_ID_exists
|
73
|
+
sa1 = FactoryForm::ShortAnswer.new(:id => "email_1", :label => "Official email address")
|
74
|
+
sa2 = FactoryForm::ShortAnswer.new(:id => "email_1", :label => "Personal email address")
|
75
|
+
form = FactoryForm::Form.new
|
76
|
+
form.add(sa1)
|
77
|
+
|
78
|
+
# Raise duplicate ID exception
|
79
|
+
assert_raise(FactoryForm::DuplicateIDException){ form.add(sa2) }
|
80
|
+
end
|
81
|
+
|
82
|
+
|
83
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TextDataTest < Test::Unit::TestCase
|
4
|
+
def test_should_create_text_data_field_with_minimum_params_passed
|
5
|
+
td = FactoryForm::TextData.new(:id => "email_1", :label => "Personal email address")
|
6
|
+
assert_equal "Personal email address",td.label
|
7
|
+
assert_equal 'text_data', td.field_type
|
8
|
+
assert_equal 'general', td.validation_format
|
9
|
+
assert_equal 'Personal email address', td.value
|
10
|
+
assert_equal true, td.required
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_should_raise_exception_unless_required_params_passed
|
14
|
+
# Raise expected argument exception as ID,label are required
|
15
|
+
assert_raise(FactoryForm::ParameterExpectedException){ FactoryForm::TextData.new() }
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class TimeAnswerTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_should_create_time_answer_field
|
6
|
+
number = FactoryForm::TimeAnswer.new(:id => "time_1", :label => "Give departure time")
|
7
|
+
assert_equal "time", number.validation_format
|
8
|
+
end
|
9
|
+
|
10
|
+
end
|
data/test/url_test.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class UrlTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
def test_should_create_url_answer_field
|
6
|
+
url = FactoryForm::Url.new(:id => "url_1", :label => "Give url")
|
7
|
+
assert_equal "url", url.validation_format
|
8
|
+
assert_equal "short_answer", url.field_type
|
9
|
+
end
|
10
|
+
|
11
|
+
end
|
metadata
ADDED
@@ -0,0 +1,169 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: formhelper
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- shyamkkhadka
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-09-24 00:00:00 +05:45
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: json_pure
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 1
|
30
|
+
segments:
|
31
|
+
- 1
|
32
|
+
- 4
|
33
|
+
- 3
|
34
|
+
version: 1.4.3
|
35
|
+
type: :development
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: json_pure
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 1
|
46
|
+
segments:
|
47
|
+
- 1
|
48
|
+
- 4
|
49
|
+
- 3
|
50
|
+
version: 1.4.3
|
51
|
+
type: :runtime
|
52
|
+
version_requirements: *id002
|
53
|
+
description: "This is a library to create different form field elements, allows form object to parse into different formats (YAML, JSON, XML)\n "
|
54
|
+
email: shyamkkhadka@gmail.com
|
55
|
+
executables: []
|
56
|
+
|
57
|
+
extensions: []
|
58
|
+
|
59
|
+
extra_rdoc_files:
|
60
|
+
- README
|
61
|
+
- README.rdoc
|
62
|
+
files:
|
63
|
+
- README
|
64
|
+
- README.rdoc
|
65
|
+
- test/boolean_test.rb
|
66
|
+
- test/currency_test.rb
|
67
|
+
- test/date_answer_test.rb
|
68
|
+
- test/descriptive_content_test.rb
|
69
|
+
- test/field_test.rb
|
70
|
+
- test/form_test.rb
|
71
|
+
- test/image_data_test.rb
|
72
|
+
- test/init.rb
|
73
|
+
- test/lib/factoryform/boolean.rb
|
74
|
+
- test/lib/factoryform/currency.rb
|
75
|
+
- test/lib/factoryform/date_answer.rb
|
76
|
+
- test/lib/factoryform/descriptive_content.rb
|
77
|
+
- test/lib/factoryform/email.rb
|
78
|
+
- test/lib/factoryform/field.rb
|
79
|
+
- test/lib/factoryform/form.rb
|
80
|
+
- test/lib/factoryform/image_data.rb
|
81
|
+
- test/lib/factoryform/long_answer.rb
|
82
|
+
- test/lib/factoryform/multiple_choice.rb
|
83
|
+
- test/lib/factoryform/number.rb
|
84
|
+
- test/lib/factoryform/rating.rb
|
85
|
+
- test/lib/factoryform/short_answer.rb
|
86
|
+
- test/lib/factoryform/text_data.rb
|
87
|
+
- test/lib/factoryform/time_answer.rb
|
88
|
+
- test/lib/factoryform/url.rb
|
89
|
+
- test/lib/factoryform/utils.rb
|
90
|
+
- test/lib/factoryform.rb
|
91
|
+
- test/long_answer_test.rb
|
92
|
+
- test/multiple_choice_test.rb
|
93
|
+
- test/number_test.rb
|
94
|
+
- test/rating_test.rb
|
95
|
+
- test/short_answer_test.rb
|
96
|
+
- test/test_helper.rb
|
97
|
+
- test/text_data_test.rb
|
98
|
+
- test/time_answer_test.rb
|
99
|
+
- test/url_test.rb
|
100
|
+
has_rdoc: true
|
101
|
+
homepage: http://github.com/shyamkkhadka/formhelper
|
102
|
+
licenses: []
|
103
|
+
|
104
|
+
post_install_message:
|
105
|
+
rdoc_options:
|
106
|
+
- --charset=UTF-8
|
107
|
+
require_paths:
|
108
|
+
- lib
|
109
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
110
|
+
none: false
|
111
|
+
requirements:
|
112
|
+
- - ">="
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
hash: 3
|
115
|
+
segments:
|
116
|
+
- 0
|
117
|
+
version: "0"
|
118
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
119
|
+
none: false
|
120
|
+
requirements:
|
121
|
+
- - ">="
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
hash: 3
|
124
|
+
segments:
|
125
|
+
- 0
|
126
|
+
version: "0"
|
127
|
+
requirements: []
|
128
|
+
|
129
|
+
rubyforge_project:
|
130
|
+
rubygems_version: 1.3.7
|
131
|
+
signing_key:
|
132
|
+
specification_version: 3
|
133
|
+
summary: This is a library to create different form field elements, allows form object to parse into different formats (YAML, JSON, XML)
|
134
|
+
test_files:
|
135
|
+
- test/boolean_test.rb
|
136
|
+
- test/currency_test.rb
|
137
|
+
- test/date_answer_test.rb
|
138
|
+
- test/descriptive_content_test.rb
|
139
|
+
- test/field_test.rb
|
140
|
+
- test/form_test.rb
|
141
|
+
- test/image_data_test.rb
|
142
|
+
- test/init.rb
|
143
|
+
- test/lib/factoryform/boolean.rb
|
144
|
+
- test/lib/factoryform/currency.rb
|
145
|
+
- test/lib/factoryform/date_answer.rb
|
146
|
+
- test/lib/factoryform/descriptive_content.rb
|
147
|
+
- test/lib/factoryform/email.rb
|
148
|
+
- test/lib/factoryform/field.rb
|
149
|
+
- test/lib/factoryform/form.rb
|
150
|
+
- test/lib/factoryform/image_data.rb
|
151
|
+
- test/lib/factoryform/long_answer.rb
|
152
|
+
- test/lib/factoryform/multiple_choice.rb
|
153
|
+
- test/lib/factoryform/number.rb
|
154
|
+
- test/lib/factoryform/rating.rb
|
155
|
+
- test/lib/factoryform/short_answer.rb
|
156
|
+
- test/lib/factoryform/text_data.rb
|
157
|
+
- test/lib/factoryform/time_answer.rb
|
158
|
+
- test/lib/factoryform/url.rb
|
159
|
+
- test/lib/factoryform/utils.rb
|
160
|
+
- test/lib/factoryform.rb
|
161
|
+
- test/long_answer_test.rb
|
162
|
+
- test/multiple_choice_test.rb
|
163
|
+
- test/number_test.rb
|
164
|
+
- test/rating_test.rb
|
165
|
+
- test/short_answer_test.rb
|
166
|
+
- test/test_helper.rb
|
167
|
+
- test/text_data_test.rb
|
168
|
+
- test/time_answer_test.rb
|
169
|
+
- test/url_test.rb
|