diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG index 2bf3bc9a756223eaf337949db6eb48e69be92c14..87fe23547703d97c286d4e4b0e6835cff15c2a4e 100644 --- a/actionpack/CHANGELOG +++ b/actionpack/CHANGELOG @@ -1,5 +1,21 @@ *SVN* +* Makes :discard_year work without breaking multi-attribute parsing in AR. #1260, #3800 [sean@ardismg.com, jmartin@desertflood.com, stephen@touset.org, Bob Silva] + +* Adds html id attribute to date helper elements. #1050, #1382 [mortonda@dgrmm.net, David North, Bob Silva] + +* Add :index and @auto_index capability to model driven date/time selects. #847, #2655 [moriq, Doug Fales, Bob Silva] + +* Add :order to datetime_select, select_datetime, and select_date. #1427 [Timothee Peignier, patrick@lenz.sh, Bob Silva] + +* Added time_select to work with time values in models. Update scaffolding. #2489, #2833 [Justin Palmer, Andre Caum, Bob Silva] + +* Added :include_seconds to select_datetime, datetime_select and time_select. #2998 [csn, Bob Silva] + +* All date/datetime selects can now accept an array of month names with :use_month_names. Allows for localization. #363 [tomasj, Bob Silva] + +* Adds :time_separator to select_time and :date_separator to select_datetime. Preserves BC. #3811 [Bob Silva] + * Added map.root as an alias for map.connect '' [DHH] * Added Request#format to return the format used for the request as a mime type. If no format is specified, the first Request#accepts type is used. This means you can stop using respond_to for anything else than responses [DHH]. Examples: diff --git a/actionpack/lib/action_view/helpers/active_record_helper.rb b/actionpack/lib/action_view/helpers/active_record_helper.rb index 7a1aeff3423f2ec539b708e7542c7910d20f80e2..a001ae5e65152740269b94e1badf9d58ec2bbbca 100644 --- a/actionpack/lib/action_view/helpers/active_record_helper.rb +++ b/actionpack/lib/action_view/helpers/active_record_helper.rb @@ -167,6 +167,8 @@ def to_tag(options = {}) to_date_select_tag(options) when :datetime, :timestamp to_datetime_select_tag(options) + when :time + to_time_select_tag(options) when :boolean to_boolean_select_tag(options) end @@ -208,6 +210,15 @@ def to_datetime_select_tag(options = {}) end end + alias_method :to_time_select_tag_without_error_wrapping, :to_time_select_tag + def to_time_select_tag(options = {}) + if object.respond_to?("errors") && object.errors.respond_to?("on") + error_wrapping(to_time_select_tag_without_error_wrapping(options), object.errors.on(@method_name)) + else + to_time_select_tag_without_error_wrapping(options) + end + end + def error_wrapping(html_tag, has_error) has_error ? Base.field_error_proc.call(html_tag, self) : html_tag end diff --git a/actionpack/lib/action_view/helpers/date_helper.rb b/actionpack/lib/action_view/helpers/date_helper.rb index 5a86ecc2abaef5322584a70d69d8f1fdbefbfa52..6123cd9114e4227df938a02d59520a716a648509 100755 --- a/actionpack/lib/action_view/helpers/date_helper.rb +++ b/actionpack/lib/action_view/helpers/date_helper.rb @@ -62,7 +62,7 @@ def distance_of_time_in_words(from_time, to_time = 0, include_seconds = false) when 40..59 then 'less than a minute' else '1 minute' end - + when 2..44 then "#{distance_in_minutes} minutes" when 45..89 then 'about 1 hour' when 90..1439 then "about #{(distance_in_minutes.to_f / 60.0).round} hours" @@ -74,12 +74,12 @@ def distance_of_time_in_words(from_time, to_time = 0, include_seconds = false) else "over #{(distance_in_minutes / 525960).round} years" end end - + # Like distance_of_time_in_words, but where to_time is fixed to Time.now. def time_ago_in_words(from_time, include_seconds = false) distance_of_time_in_words(from_time, Time.now, include_seconds) end - + alias_method :distance_of_time_in_words_to_now, :time_ago_in_words # Returns a set of select tags (one for year, month, and day) pre-selected for accessing a specified date-based attribute (identified by @@ -108,6 +108,19 @@ def date_select(object_name, method, options = {}) InstanceTag.new(object_name, method, self, nil, options.delete(:object)).to_date_select_tag(options) end + # Returns a set of select tags (one for hour, minute and optionally second) pre-selected for accessing a specified + # time-based attribute (identified by +method+) on an object assigned to the template (identified by +object+). + # You can include the seconds with :include_seconds. + # Examples: + # + # time_select("post", "sunrise") + # time_select("post", "start_time", :include_seconds => true) + # + # The selects are prepared for multi-parameter assignment to an Active Record object. + def time_select(object_name, method, options = {}) + InstanceTag.new(object_name, method, self, nil, options.delete(:object)).to_time_select_tag(options) + end + # Returns a set of select tags (one for year, month, day, hour, and minute) pre-selected for accessing a specified datetime-based # attribute (identified by +method+) on an object assigned to the template (identified by +object+). Examples: # @@ -119,36 +132,55 @@ def datetime_select(object_name, method, options = {}) InstanceTag.new(object_name, method, self, nil, options.delete(:object)).to_datetime_select_tag(options) end + # Returns a set of html select-tags (one for year, month, day, hour, and minute) pre-selected with the +datetime+. + # It's also possible to explicitly set the order of the tags using the :order option with an array of + # symbols :year, :month and :day in the desired order. If you do not supply a Symbol, it + # will be appened onto the :order passed in. You can also add :date_separator and :time_separator + # keys to the +options+ to control visual display of the elements. + def select_datetime(datetime = Time.now, options = {}) + separator = options[:datetime_separator] || '' + select_date(datetime, options) + separator + select_time(datetime, options) + end + # Returns a set of html select-tags (one for year, month, and day) pre-selected with the +date+. + # It's possible to explicitly set the order of the tags using the :order option with an array of + # symbols :year, :month and :day in the desired order. If you do not supply a Symbol, it + # will be appened onto the :order passed in. def select_date(date = Date.today, options = {}) - select_year(date, options) + select_month(date, options) + select_day(date, options) - end + options[:order] ||= [] + [:year, :month, :day].each { |o| options[:order].push(o) unless options[:order].include?(o) } - # Returns a set of html select-tags (one for year, month, day, hour, and minute) pre-selected with the +datetime+. - def select_datetime(datetime = Time.now, options = {}) - select_year(datetime, options) + select_month(datetime, options) + select_day(datetime, options) + - select_hour(datetime, options) + select_minute(datetime, options) + select_date = '' + options[:order].each do |o| + select_date << self.send("select_#{o}", date, options) + end + select_date end # Returns a set of html select-tags (one for hour and minute) + # You can set :add_separator key to format the output. def select_time(datetime = Time.now, options = {}) - h = select_hour(datetime, options) + select_minute(datetime, options) + (options[:include_seconds] ? select_second(datetime, options) : '') + separator = options[:time_separator] || '' + select_hour(datetime, options) + separator + select_minute(datetime, options) + (options[:include_seconds] ? separator + select_second(datetime, options) : '') end # Returns a select tag with options for each of the seconds 0 through 59 with the current second selected. # The second can also be substituted for a second number. # Override the field name using the :field_name option, 'second' by default. def select_second(datetime, options = {}) - second_options = [] - - 0.upto(59) do |second| - second_options << ((datetime && (datetime.kind_of?(Fixnum) ? datetime : datetime.sec) == second) ? - %(\n) : - %(\n) - ) + val = datetime ? (datetime.kind_of?(Fixnum) ? datetime : datetime.sec) : '' + if options[:use_hidden] + options[:include_seconds] ? hidden_html(options[:field_name] || 'second', val, options) : '' + else + second_options = [] + 0.upto(59) do |second| + second_options << ((val == second) ? + %(\n) : + %(\n) + ) + end + select_html(options[:field_name] || 'second', second_options, options) end - - select_html(options[:field_name] || 'second', second_options, options[:prefix], options[:include_blank], options[:discard_type], options[:disabled]) end # Returns a select tag with options for each of the minutes 0 through 59 with the current minute selected. @@ -156,84 +188,100 @@ def select_second(datetime, options = {}) # The minute can also be substituted for a minute number. # Override the field name using the :field_name option, 'minute' by default. def select_minute(datetime, options = {}) - minute_options = [] - - 0.step(59, options[:minute_step] || 1) do |minute| - minute_options << ((datetime && (datetime.kind_of?(Fixnum) ? datetime : datetime.min) == minute) ? - %(\n) : - %(\n) - ) - end - - select_html(options[:field_name] || 'minute', minute_options, options[:prefix], options[:include_blank], options[:discard_type], options[:disabled]) + val = datetime ? (datetime.kind_of?(Fixnum) ? datetime : datetime.min) : '' + if options[:use_hidden] + hidden_html(options[:field_name] || 'minute', val, options) + else + minute_options = [] + 0.step(59, options[:minute_step] || 1) do |minute| + minute_options << ((val == minute) ? + %(\n) : + %(\n) + ) + end + select_html(options[:field_name] || 'minute', minute_options, options) + end end # Returns a select tag with options for each of the hours 0 through 23 with the current hour selected. # The hour can also be substituted for a hour number. # Override the field name using the :field_name option, 'hour' by default. def select_hour(datetime, options = {}) - hour_options = [] - - 0.upto(23) do |hour| - hour_options << ((datetime && (datetime.kind_of?(Fixnum) ? datetime : datetime.hour) == hour) ? - %(\n) : - %(\n) - ) + val = datetime ? (datetime.kind_of?(Fixnum) ? datetime : datetime.hour) : '' + if options[:use_hidden] + hidden_html(options[:field_name] || 'hour', val, options) + else + hour_options = [] + 0.upto(23) do |hour| + hour_options << ((val == hour) ? + %(\n) : + %(\n) + ) + end + select_html(options[:field_name] || 'hour', hour_options, options) end - - select_html(options[:field_name] || 'hour', hour_options, options[:prefix], options[:include_blank], options[:discard_type], options[:disabled]) end # Returns a select tag with options for each of the days 1 through 31 with the current day selected. # The date can also be substituted for a hour number. # Override the field name using the :field_name option, 'day' by default. def select_day(date, options = {}) - day_options = [] - - 1.upto(31) do |day| - day_options << ((date && (date.kind_of?(Fixnum) ? date : date.day) == day) ? - %(\n) : - %(\n) - ) + val = date ? (date.kind_of?(Fixnum) ? date : date.day) : '' + if options[:use_hidden] + hidden_html(options[:field_name] || 'day', val, options) + else + day_options = [] + 1.upto(31) do |day| + day_options << ((val == day) ? + %(\n) : + %(\n) + ) + end + select_html(options[:field_name] || 'day', day_options, options) end - - select_html(options[:field_name] || 'day', day_options, options[:prefix], options[:include_blank], options[:discard_type], options[:disabled]) end # Returns a select tag with options for each of the months January through December with the current month selected. # The month names are presented as keys (what's shown to the user) and the month numbers (1-12) are used as values # (what's submitted to the server). It's also possible to use month numbers for the presentation instead of names -- # set the :use_month_numbers key in +options+ to true for this to happen. If you want both numbers and names, - # set the :add_month_numbers key in +options+ to true. Examples: + # set the :add_month_numbers key in +options+ to true. If you would prefer to show month names as abbreviations, + # set the :use_short_month key in +options+ to true. If you want to use your own month names, set the + # :use_month_names key in +options+ to an array of 12 month names. + # + # Examples: # # select_month(Date.today) # Will use keys like "January", "March" # select_month(Date.today, :use_month_numbers => true) # Will use keys like "1", "3" # select_month(Date.today, :add_month_numbers => true) # Will use keys like "1 - January", "3 - March" + # select_month(Date.today, :use_short_month => true) # Will use keys like "Jan", "Mar" + # select_month(Date.today, :use_month_names => %w(Januar Februar Marts ...)) # Will use keys like "Januar", "Marts" # # Override the field name using the :field_name option, 'month' by default. - # - # If you would prefer to show month names as abbreviations, set the - # :use_short_month key in +options+ to true. def select_month(date, options = {}) - month_options = [] - month_names = options[:use_short_month] ? Date::ABBR_MONTHNAMES : Date::MONTHNAMES - - 1.upto(12) do |month_number| - month_name = if options[:use_month_numbers] - month_number - elsif options[:add_month_numbers] - month_number.to_s + ' - ' + month_names[month_number] - else - month_names[month_number] - end + val = date ? (date.kind_of?(Fixnum) ? date : date.month) : '' + if options[:use_hidden] + hidden_html(options[:field_name] || 'month', val, options) + else + month_options = [] + month_names = options[:use_month_names] || (options[:use_short_month] ? Date::ABBR_MONTHNAMES : Date::MONTHNAMES) + month_names.unshift(nil) if month_names.size < 13 + 1.upto(12) do |month_number| + month_name = if options[:use_month_numbers] + month_number + elsif options[:add_month_numbers] + month_number.to_s + ' - ' + month_names[month_number] + else + month_names[month_number] + end - month_options << ((date && (date.kind_of?(Fixnum) ? date : date.month) == month_number) ? - %(\n) : - %(\n) - ) + month_options << ((val == month_number) ? + %(\n) : + %(\n) + ) + end + select_html(options[:field_name] || 'month', month_options, options) end - - select_html(options[:field_name] || 'month', month_options, options[:prefix], options[:include_blank], options[:discard_type], options[:disabled]) end # Returns a select tag with options for each of the five years on each side of the current, which is selected. The five year radius @@ -243,37 +291,51 @@ def select_month(date, options = {}) # # select_year(Date.today, :start_year => 1992, :end_year => 2007) # ascending year values # select_year(Date.today, :start_year => 2005, :end_year => 1900) # descending year values + # select_year(2006, :start_year => 2000, :end_year => 2010) # # Override the field name using the :field_name option, 'year' by default. def select_year(date, options = {}) - year_options = [] - y = date ? (date.kind_of?(Fixnum) ? (y = (date == 0) ? Date.today.year : date) : date.year) : Date.today.year - - start_year, end_year = (options[:start_year] || y-5), (options[:end_year] || y+5) - step_val = start_year < end_year ? 1 : -1 - - start_year.step(end_year, step_val) do |year| - year_options << ((date && (date.kind_of?(Fixnum) ? date : date.year) == year) ? - %(\n) : - %(\n) - ) + val = date ? (date.kind_of?(Fixnum) ? date : date.year) : '' + if options[:use_hidden] + hidden_html(options[:field_name] || 'year', val, options) + else + year_options = [] + y = date ? (date.kind_of?(Fixnum) ? (y = (date == 0) ? Date.today.year : date) : date.year) : Date.today.year + + start_year, end_year = (options[:start_year] || y-5), (options[:end_year] || y+5) + step_val = start_year < end_year ? 1 : -1 + start_year.step(end_year, step_val) do |year| + year_options << ((val == year) ? + %(\n) : + %(\n) + ) + end + select_html(options[:field_name] || 'year', year_options, options) end - - select_html(options[:field_name] || 'year', year_options, options[:prefix], options[:include_blank], options[:discard_type], options[:disabled]) end private - def select_html(type, options, prefix = nil, include_blank = false, discard_type = false, disabled = false) - select_html = %(\n" end + def hidden_html(type, value, options) + name_and_id_from_options(options, type) + hidden_html = %(\n) + end + + def name_and_id_from_options(options, type) + options[:name] = (options[:prefix] || DEFAULT_PREFIX) + (options[:discard_type] ? '' : "[#{type}]") + options[:id] = options[:name].gsub(/([\[\(])|(\]\[)/, '_').gsub(/[\]\)]/, '') + end + def leading_zero_on_single_digits(number) number > 9 ? number : "0#{number}" end @@ -283,45 +345,71 @@ class InstanceTag #:nodoc: include DateHelper def to_date_select_tag(options = {}) - defaults = { :discard_type => true } - options = defaults.merge(options) - options_with_prefix = Proc.new { |position| options.merge(:prefix => "#{@object_name}[#{@method_name}(#{position}i)]") } - value = value(object) - date = options[:include_blank] ? (value || 0) : (value || Date.today) + date_or_time_select options.merge(:discard_hour => true) + end - date_select = '' - options[:order] = [:month, :year, :day] if options[:month_before_year] # For backwards compatibility - options[:order] ||= [:year, :month, :day] + def to_time_select_tag(options = {}) + date_or_time_select options.merge(:discard_year => true, :discard_month => true) + end - position = {:year => 1, :month => 2, :day => 3} + def to_datetime_select_tag(options = {}) + date_or_time_select options + end - discard = {} - discard[:year] = true if options[:discard_year] - discard[:month] = true if options[:discard_month] - discard[:day] = true if options[:discard_day] or options[:discard_month] + private + def date_or_time_select(options) + defaults = { :discard_type => true } + options = defaults.merge(options) + datetime = value(object) + datetime ||= Time.now if options[:include_blank] + + position = { :year => 1, :month => 2, :day => 3, :hour => 4, :minute => 5, :second => 6 } + + order = (options[:order] ||= [:year, :month, :day]) + + # Discard explicit and implicit by not being included in the :order + discard = {} + discard[:year] = true if options[:discard_year] or !order.include?(:year) + discard[:month] = true if options[:discard_month] or !order.include?(:month) + discard[:day] = true if options[:discard_day] or discard[:month] or !order.include?(:day) + discard[:hour] = true if options[:discard_hour] + discard[:minute] = true if options[:discard_minute] or discard[:hour] + discard[:second] = true unless options[:include_seconds] && !discard[:minute] + + # Maintain valid dates by including hidden fields for discarded elements + [:day, :month, :year].each { |o| order.unshift(o) unless order.include?(o) } + # Ensure proper ordering of :hour, :minute and :second + [:hour, :minute, :second].each { |o| order.delete(o); order.push(o) } + + date_or_time_select = '' + order.reverse.each do |param| + # Send hidden fields for discarded elements once output has started + # This ensures AR can reconstruct valid dates using ParseDate + next if discard[param] && date_or_time_select.empty? + + date_or_time_select.insert(0, self.send("select_#{param}", datetime, options_with_prefix(position[param], options.merge(:use_hidden => discard[param])))) + date_or_time_select.insert(0, + case param + when :hour then (discard[:year] && discard[:day] ? "" : " — ") + when :minute then " : " + when :second then options[:include_seconds] ? " : " : "" + else "" + end) - options[:order].each do |param| - date_select << self.send("select_#{param}", date, options_with_prefix.call(position[param])) unless discard[param] - end + end - date_select - end + date_or_time_select + end - def to_datetime_select_tag(options = {}) - defaults = { :discard_type => true } - options = defaults.merge(options) - options_with_prefix = Proc.new { |position| options.merge(:prefix => "#{@object_name}[#{@method_name}(#{position}i)]") } - value = value(object) - datetime = options[:include_blank] ? (value || nil) : (value || Time.now) - - datetime_select = select_year(datetime, options_with_prefix.call(1)) - datetime_select << select_month(datetime, options_with_prefix.call(2)) unless options[:discard_month] - datetime_select << select_day(datetime, options_with_prefix.call(3)) unless options[:discard_day] || options[:discard_month] - datetime_select << ' — ' + select_hour(datetime, options_with_prefix.call(4)) unless options[:discard_hour] - datetime_select << ' : ' + select_minute(datetime, options_with_prefix.call(5)) unless options[:discard_minute] || options[:discard_hour] - - datetime_select - end + def options_with_prefix(position, options) + prefix = "#{@object_name}" + if options[:index] + prefix << "[#{options[:index]}]" + elsif @auto_index + prefix << "[#{@auto_index}]" + end + options.merge(:prefix => "#{prefix}[#{@method_name}(#{position}i)]") + end end class FormBuilder @@ -329,6 +417,10 @@ def date_select(method, options = {}) @template.date_select(@object_name, method, options.merge(:object => @object)) end + def time_select(method, options = {}) + @template.time_select(@object_name, method, options.merge(:object => @object)) + end + def datetime_select(method, options = {}) @template.datetime_select(@object_name, method, options.merge(:object => @object)) end diff --git a/actionpack/test/template/active_record_helper_test.rb b/actionpack/test/template/active_record_helper_test.rb index 6f7f013de4a2e2070d208a7d232ef3797067e46f..8b6a7abd6f3a57eef655fd59d5925c724e594035 100644 --- a/actionpack/test/template/active_record_helper_test.rb +++ b/actionpack/test/template/active_record_helper_test.rb @@ -1,4 +1,4 @@ -require 'test/unit' +require File.dirname(__FILE__) + '/../abstract_unit' require File.dirname(__FILE__) + '/../../lib/action_view/helpers/date_helper' require File.dirname(__FILE__) + '/../../lib/action_view/helpers/form_helper' require File.dirname(__FILE__) + '/../../lib/action_view/helpers/text_helper' @@ -143,7 +143,7 @@ def Post.content_columns() [ Column.new(:date, "written_on", "Written on") ] end end assert_dom_equal( - %(


\n\n\n

), + %(


\n\n\n

), form("post") ) end @@ -155,7 +155,7 @@ def Post.content_columns() [ Column.new(:datetime, "written_on", "Written on") ] @post.written_on = Time.gm(2004, 6, 15, 16, 30) assert_dom_equal( - %(


\n\n\n — \n : \n

), + %(


\n\n\n — \n : \n

), form("post") ) end diff --git a/actionpack/test/template/date_helper_test.rb b/actionpack/test/template/date_helper_test.rb index 461dfd13c00b41287a2e7c662a57ea1f6f5a76f7..c03ba69f3f72d8dc91fc91d2161b5d14a0109ebe 100755 --- a/actionpack/test/template/date_helper_test.rb +++ b/actionpack/test/template/date_helper_test.rb @@ -6,12 +6,20 @@ class DateHelperTest < Test::Unit::TestCase include ActionView::Helpers::FormHelper silence_warnings do - Post = Struct.new("Post", :written_on, :updated_at) + Post = Struct.new("Post", :id, :written_on, :updated_at) + Post.class_eval do + def id + 123 + end + def id_before_type_cast + 123 + end + end end def test_distance_in_words from = Time.mktime(2004, 3, 6, 21, 45, 0) - + # 0..1 with include_seconds assert_equal "less than 5 seconds", distance_of_time_in_words(from, from + 0.seconds, true) assert_equal "less than 5 seconds", distance_of_time_in_words(from, from + 4.seconds, true) @@ -67,11 +75,11 @@ def test_distance_in_words # > 1051920 assert_equal "over 2 years", distance_of_time_in_words(from, from + 2.years - 30.seconds) assert_equal "over 10 years", distance_of_time_in_words(from, from + 10.years) - + # test to < from assert_equal "about 4 hours", distance_of_time_in_words(from + 4.hours, from) assert_equal "less than 20 seconds", distance_of_time_in_words(from + 19.seconds, from, true) - + # test with integers assert_equal "less than a minute", distance_of_time_in_words(59) assert_equal "about 1 hour", distance_of_time_in_words(60*60) @@ -91,9 +99,8 @@ def test_time_ago_in_words end def test_select_day - expected = %(\n) + expected << %(\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" assert_equal expected, select_day(Time.mktime(2003, 8, 16)) @@ -101,26 +108,24 @@ def test_select_day end def test_select_day_with_blank - expected = %(\n) + expected << %(\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" assert_equal expected, select_day(Time.mktime(2003, 8, 16), :include_blank => true) assert_equal expected, select_day(16, :include_blank => true) end - + def test_select_day_nil_with_blank - expected = %(\n) + expected << %(\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" assert_equal expected, select_day(nil, :include_blank => true) end def test_select_month - expected = %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" @@ -129,7 +134,7 @@ def test_select_month end def test_select_month_with_disabled - expected = %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" @@ -138,7 +143,7 @@ def test_select_month_with_disabled end def test_select_month_with_field_name_override - expected = %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" @@ -147,7 +152,7 @@ def test_select_month_with_field_name_override end def test_select_month_with_blank - expected = %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" @@ -156,7 +161,7 @@ def test_select_month_with_blank end def test_select_month_nil_with_blank - expected = %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" @@ -164,7 +169,7 @@ def test_select_month_nil_with_blank end def test_select_month_with_numbers - expected = %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" @@ -173,7 +178,7 @@ def test_select_month_with_numbers end def test_select_month_with_numbers_and_names - expected = %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" @@ -182,7 +187,7 @@ def test_select_month_with_numbers_and_names end def test_select_month_with_numbers_and_names_with_abbv - expected = %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" @@ -191,7 +196,7 @@ def test_select_month_with_numbers_and_names_with_abbv end def test_select_month_with_abbv - expected = %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" @@ -199,95 +204,117 @@ def test_select_month_with_abbv assert_equal expected, select_month(8, :use_short_month => true) end + def test_select_month_with_custom_names + month_names = %w(nil Januar Februar Marts April Maj Juni Juli August September Oktober November December) + + expected = %(\n" + + assert_equal expected, select_month(Time.mktime(2003, 8, 16), :use_month_names => month_names) + assert_equal expected, select_month(8, :use_month_names => month_names) + end + + def test_select_month_with_zero_indexed_custom_names + month_names = %w(Januar Februar Marts April Maj Juni Juli August September Oktober November December) + + expected = %(\n" + + assert_equal expected, select_month(Time.mktime(2003, 8, 16), :use_month_names => month_names) + assert_equal expected, select_month(8, :use_month_names => month_names) + end + def test_select_year - expected = %(\n) expected << %(\n\n\n) expected << "\n" - + assert_equal expected, select_year(Time.mktime(2003, 8, 16), :start_year => 2003, :end_year => 2005) assert_equal expected, select_year(2003, :start_year => 2003, :end_year => 2005) end def test_select_year_with_disabled - expected = %(\n) expected << %(\n\n\n) expected << "\n" - + assert_equal expected, select_year(Time.mktime(2003, 8, 16), :disabled => true, :start_year => 2003, :end_year => 2005) assert_equal expected, select_year(2003, :disabled => true, :start_year => 2003, :end_year => 2005) end def test_select_year_with_field_name_override - expected = %(\n) expected << %(\n\n\n) expected << "\n" - + assert_equal expected, select_year(Time.mktime(2003, 8, 16), :start_year => 2003, :end_year => 2005, :field_name => 'annee') assert_equal expected, select_year(2003, :start_year => 2003, :end_year => 2005, :field_name => 'annee') end - + def test_select_year_with_type_discarding - expected = %(\n) expected << %(\n\n\n) expected << "\n" - + assert_equal expected, select_year( Time.mktime(2003, 8, 16), :prefix => "date_year", :discard_type => true, :start_year => 2003, :end_year => 2005) assert_equal expected, select_year( 2003, :prefix => "date_year", :discard_type => true, :start_year => 2003, :end_year => 2005) end - + def test_select_year_descending - expected = %(\n) expected << %(\n\n\n) expected << "\n" - + assert_equal expected, select_year(Time.mktime(2005, 8, 16), :start_year => 2005, :end_year => 2003) assert_equal expected, select_year(2005, :start_year => 2005, :end_year => 2003) end def test_select_hour - expected = %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" - + assert_equal expected, select_hour(Time.mktime(2003, 8, 16, 8, 4, 18)) end def test_select_hour_with_disabled - expected = %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" - + assert_equal expected, select_hour(Time.mktime(2003, 8, 16, 8, 4, 18), :disabled => true) end - + def test_select_hour_with_field_name_override - expected = %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" - + assert_equal expected, select_hour(Time.mktime(2003, 8, 16, 8, 4, 18), :field_name => 'heure') end def test_select_hour_with_blank - expected = %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" - + assert_equal expected, select_hour(Time.mktime(2003, 8, 16, 8, 4, 18), :include_blank => true) end def test_select_hour_nil_with_blank - expected = %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" - + assert_equal expected, select_hour(nil, :include_blank => true) end def test_select_minute - expected = %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" @@ -295,7 +322,7 @@ def test_select_minute end def test_select_minute_with_disabled - expected = %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" @@ -303,7 +330,7 @@ def test_select_minute_with_disabled end def test_select_minute_with_field_name_override - expected = %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" @@ -311,7 +338,7 @@ def test_select_minute_with_field_name_override end def test_select_minute_with_blank - expected = %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" @@ -319,7 +346,7 @@ def test_select_minute_with_blank end def test_select_minute_with_blank_and_step - expected = %(\n) expected << %(\n\n\n\n\n) expected << "\n" @@ -327,7 +354,7 @@ def test_select_minute_with_blank_and_step end def test_select_minute_nil_with_blank - expected = %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" @@ -335,39 +362,39 @@ def test_select_minute_nil_with_blank end def test_select_minute_nil_with_blank_and_step - expected = %(\n) expected << %(\n\n\n\n\n) expected << "\n" assert_equal expected, select_minute(nil, { :include_blank => true , :minute_step => 15 }) end - + def test_select_second - expected = %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" assert_equal expected, select_second(Time.mktime(2003, 8, 16, 8, 4, 18)) end - + def test_select_second_with_disabled - expected = %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" assert_equal expected, select_second(Time.mktime(2003, 8, 16, 8, 4, 18), :disabled => true) end - + def test_select_second_with_field_name_override - expected = %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" assert_equal expected, select_second(Time.mktime(2003, 8, 16, 8, 4, 18), :field_name => 'segundo') end - + def test_select_second_with_blank - expected = %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" @@ -375,53 +402,81 @@ def test_select_second_with_blank end def test_select_second_nil_with_blank - expected = %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" assert_equal expected, select_second(nil, :include_blank => true) end - + def test_select_date - expected = %(\n) expected << %(\n\n\n) expected << "\n" - expected << %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" - expected << %(\n) + expected << %(\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" - - assert_equal expected, select_date( - Time.mktime(2003, 8, 16), :start_year => 2003, :end_year => 2005, :prefix => "date[first]" - ) + + assert_equal expected, select_date(Time.mktime(2003, 8, 16), :start_year => 2003, :end_year => 2005, :prefix => "date[first]") + end + + def test_select_date_with_order + expected = %(\n" + + expected << %(\n" + + expected << %(\n" + + assert_equal expected, select_date(Time.mktime(2003, 8, 16), :start_year => 2003, :end_year => 2005, :prefix => "date[first]", :order => [:month, :day, :year]) + end + + def test_select_date_with_incomplete_order + expected = %(\n" + + expected << %(\n" + + expected << %(\n" + + assert_equal expected, select_date(Time.mktime(2003, 8, 16), :start_year => 2003, :end_year => 2005, :prefix => "date[first]", :order => [:day]) end def test_select_date_with_disabled - expected = %(\n) expected << %(\n\n\n) expected << "\n" - expected << %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" - expected << %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" - + assert_equal expected, select_date(Time.mktime(2003, 8, 16), :start_year => 2003, :end_year => 2005, :prefix => "date[first]", :disabled => true) end - def test_select_date_with_no_start_year - expected = %(\n) (Date.today.year-5).upto(Date.today.year+1) do |y| - if y == Date.today.year + if y == Date.today.year expected << %(\n) else expected << %(\n) @@ -429,22 +484,21 @@ def test_select_date_with_no_start_year end expected << "\n" - expected << %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" - expected << %(\n) + expected << %(\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" - + assert_equal expected, select_date( Time.mktime(Date.today.year, 8, 16), :end_year => Date.today.year+1, :prefix => "date[first]" ) end def test_select_date_with_no_end_year - expected = %(\n) 2003.upto(2008) do |y| if y == 2003 expected << %(\n) @@ -454,24 +508,23 @@ def test_select_date_with_no_end_year end expected << "\n" - expected << %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" - expected << %(\n) + expected << %(\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" - + assert_equal expected, select_date( Time.mktime(2003, 8, 16), :start_year => 2003, :prefix => "date[first]" ) end def test_select_date_with_no_start_or_end_year - expected = %(\n) (Date.today.year-5).upto(Date.today.year+5) do |y| - if y == Date.today.year + if y == Date.today.year expected << %(\n) else expected << %(\n) @@ -479,190 +532,748 @@ def test_select_date_with_no_start_or_end_year end expected << "\n" - expected << %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" - expected << %(\n) + expected << %(\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" - + assert_equal expected, select_date( Time.mktime(Date.today.year, 8, 16), :prefix => "date[first]" ) end + def test_select_date_with_zero_value + expected = %(\n" + + expected << %(\n" + + expected << %(\n" + + assert_equal expected, select_date(0, :start_year => 2003, :end_year => 2005, :prefix => "date[first]") + end + + def test_select_date_with_zero_value_and_no_start_year + expected = %(\n" + + expected << %(\n" + + expected << %(\n" + + assert_equal expected, select_date(0, :end_year => Date.today.year+1, :prefix => "date[first]") + end + + def test_select_date_with_zero_value_and_no_end_year + expected = %(\n" + + expected << %(\n" + + expected << %(\n" + + assert_equal expected, select_date(0, :start_year => 2003, :prefix => "date[first]") + end + + def test_select_date_with_zero_value_and_no_start_and_end_year + expected = %(\n" + + expected << %(\n" + + expected << %(\n" + + assert_equal expected, select_date(0, :prefix => "date[first]") + end + + def test_select_date_with_nil_value_and_no_start_and_end_year + expected = %(\n" + + expected << %(\n" + + expected << %(\n" + + assert_equal expected, select_date(nil, :prefix => "date[first]") + end + + def test_select_datetime + expected = %(\n" + + expected << %(\n" + + expected << %(\n" + + expected << %(\n" + + expected << %(\n" + + assert_equal expected, select_datetime(Time.mktime(2003, 8, 16, 8, 4, 18), :start_year => 2003, :end_year => 2005, :prefix => "date[first]") + end + + def test_select_datetime_with_separators + expected = %(\n" + + expected << %(\n" + + expected << %(\n" + + expected << " — " + + expected << %(\n" + + expected << " : " + + expected << %(\n" + + assert_equal expected, select_datetime(Time.mktime(2003, 8, 16, 8, 4, 18), :start_year => 2003, :end_year => 2005, :prefix => "date[first]", :datetime_separator => ' — ', :time_separator => ' : ') + end + + def test_select_datetime_with_nil_value_and_no_start_and_end_year + expected = %(\n" + + expected << %(\n" + + expected << %(\n" + + expected << %(\n" + + expected << %(\n" + + assert_equal expected, select_datetime(nil, :prefix => "date[first]") + end + + def test_select_time + expected = %(\n" + + expected << %(\n" + + assert_equal expected, select_time(Time.mktime(2003, 8, 16, 8, 4, 18)) + assert_equal expected, select_time(Time.mktime(2003, 8, 16, 8, 4, 18), :include_seconds => false) + end + + def test_select_time_with_separator + expected = %(\n" + + expected << " : " + + expected << %(\n" + + assert_equal expected, select_time(Time.mktime(2003, 8, 16, 8, 4, 18), :time_separator => ' : ') + assert_equal expected, select_time(Time.mktime(2003, 8, 16, 8, 4, 18), :time_separator => ' : ', :include_seconds => false) + end + def test_select_time_with_seconds - expected = %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" - expected << %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" - expected << %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" - + assert_equal expected, select_time(Time.mktime(2003, 8, 16, 8, 4, 18), :include_seconds => true) end - def test_select_time_without_seconds - expected = %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" - expected << %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" - assert_equal expected, select_time(Time.mktime(2003, 8, 16, 8, 4, 18)) - assert_equal expected, select_time(Time.mktime(2003, 8, 16, 8, 4, 18), :include_seconds => false) + expected << " : " + + expected << %(\n" + + assert_equal expected, select_time(Time.mktime(2003, 8, 16, 8, 4, 18), :include_seconds => true, :time_separator => ' : ') end - def test_date_select_with_zero_value - expected = %(\n} + expected << %{\n\n\n\n\n\n\n\n\n\n\n} expected << "\n" - expected << %(\n} + expected << %{\n\n\n\n\n\n\n\n\n\n\n\n} expected << "\n" - expected << %(\n} + expected << %{\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n} + expected << "\n" - - assert_equal expected, select_date(0, :start_year => 2003, :end_year => 2005, :prefix => "date[first]") + + assert_equal expected, date_select("post", "written_on") end def test_date_select_within_fields_for @post = Post.new @post.written_on = Date.new(2004, 6, 15) - + _erbout = '' - + fields_for :post, @post do |f| _erbout.concat f.date_select(:written_on) end - - expected = "\n" + - "\n" + - "\n" - assert_dom_equal(expected, _erbout) + expected = "\n" + expected << "\n" + expected << "\n" + + assert_dom_equal(expected, _erbout) + end + + def test_date_select_with_index + @post = Post.new + @post.written_on = Date.new(2004, 6, 15) + id = 456 + + expected = %{\n" + + expected << %{\n" + + expected << %{\n" + + assert_equal expected, date_select("post", "written_on", :index => id) + end + + def test_date_select_with_auto_index + @post = Post.new + @post.written_on = Date.new(2004, 6, 15) + id = 123 + + expected = %{\n" + + expected << %{\n" + + expected << %{\n" + + assert_equal expected, date_select("post[]", "written_on") + end + + def test_date_select_with_different_order + @post = Post.new + @post.written_on = Date.new(2004, 6, 15) + + expected = %{\n" + + expected << %{\n" + + expected << %{\n" + + assert_equal expected, date_select("post", "written_on", :order => [:day, :month, :year]) + end + + def test_date_select_cant_override_discard_hour + @post = Post.new + @post.written_on = Date.new(2004, 6, 15) + + expected = %{\n" + + expected << %{\n" + + expected << %{\n" + + assert_equal expected, date_select("post", "written_on", :discard_hour => false) + end + + def test_time_select + @post = Post.new + @post.written_on = Time.local(2004, 6, 15, 15, 16, 35) + + expected = %{\n} + expected << %{\n} + expected << %{\n} + + expected << %(\n" + expected << " : " + expected << %(\n" + + assert_equal expected, time_select("post", "written_on") + end + + def test_time_select_with_seconds + @post = Post.new + @post.written_on = Time.local(2004, 6, 15, 15, 16, 35) + + expected = %{\n} + expected << %{\n} + expected << %{\n} + + expected << %(\n" + expected << " : " + expected << %(\n" + expected << " : " + expected << %(\n" + + assert_equal expected, time_select("post", "written_on", :include_seconds => true) + end + + def test_datetime_select + @post = Post.new + @post.updated_at = Time.local(2004, 6, 15, 16, 35) + + expected = %{\n" + + expected << %{\n" + + expected << %{\n" + + expected << " — " + + expected << %{\n" + expected << " : " + expected << %{\n" + + assert_equal expected, datetime_select("post", "updated_at") end def test_datetime_select_within_fields_for @post = Post.new @post.updated_at = Time.local(2004, 6, 15, 16, 35) - + _erbout = '' - + fields_for :post, @post do |f| _erbout.concat f.datetime_select(:updated_at) end - - expected = "\n\n\n — \n : \n" - assert_dom_equal(expected, _erbout) + expected = "\n" + expected << "\n" + expected << "\n" + expected << " — \n" + expected << " : \n" + + assert_dom_equal(expected, _erbout) end def test_date_select_with_zero_value_and_no_start_year - expected = %(\n) (Date.today.year-5).upto(Date.today.year+1) { |y| expected << %(\n) } expected << "\n" - expected << %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" - expected << %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" - + assert_equal expected, select_date(0, :end_year => Date.today.year+1, :prefix => "date[first]") end def test_date_select_with_zero_value_and_no_end_year - expected = %(\n) last_year = Time.now.year + 5 2003.upto(last_year) { |y| expected << %(\n) } expected << "\n" - expected << %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" - expected << %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" - + assert_equal expected, select_date(0, :start_year => 2003, :prefix => "date[first]") end - + def test_date_select_with_zero_value_and_no_start_and_end_year - expected = %(\n) (Date.today.year-5).upto(Date.today.year+5) { |y| expected << %(\n) } expected << "\n" - expected << %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" - expected << %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" - + assert_equal expected, select_date(0, :prefix => "date[first]") end def test_date_select_with_nil_value_and_no_start_and_end_year - expected = %(\n) (Date.today.year-5).upto(Date.today.year+5) { |y| expected << %(\n) } expected << "\n" - expected << %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" - expected << %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" - + assert_equal expected, select_date(nil, :prefix => "date[first]") end def test_datetime_select_with_nil_value_and_no_start_and_end_year - expected = %(\n) (Date.today.year-5).upto(Date.today.year+5) { |y| expected << %(\n) } expected << "\n" - expected << %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" - expected << %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" - - expected << %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" - expected << %(\n) expected << %(\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n) expected << "\n" assert_equal expected, select_datetime(nil, :prefix => "date[first]") end + + def test_datetime_select_with_options_index + @post = Post.new + @post.updated_at = Time.local(2004, 6, 15, 16, 35) + id = 456 + + expected = %{\n" + + expected << %{\n" + + expected << %{\n" + + expected << " — " + + expected << %{\n" + expected << " : " + expected << %{\n" + + assert_equal expected, datetime_select("post", "updated_at", :index => id) + end + + def test_datetime_select_with_auto_index + @post = Post.new + @post.updated_at = Time.local(2004, 6, 15, 16, 35) + id = @post.id + + expected = %{\n" + + expected << %{\n" + + expected << %{\n" + + expected << " — " + + expected << %{\n" + expected << " : " + expected << %{\n" + + assert_equal expected, datetime_select("post[]", "updated_at") + end + + def test_datetime_select_with_seconds + @post = Post.new + @post.updated_at = Time.local(2004, 6, 15, 15, 16, 35) + + expected = %{\n" + expected << %{\n" + expected << %{\n" + + expected << " — " + + expected << %{\n" + expected << " : " + expected << %{\n" + expected << " : " + expected << %{\n" + + assert_equal expected, datetime_select("post", "updated_at", :include_seconds => true) + end + + def test_datetime_select_discard_year + @post = Post.new + @post.updated_at = Time.local(2004, 6, 15, 15, 16, 35) + + expected = %{\n} + expected << %{\n" + expected << %{\n" + + expected << " — " + + expected << %{\n" + expected << " : " + expected << %{\n" + + assert_equal expected, datetime_select("post", "updated_at", :discard_year => true) + end + + def test_datetime_select_discard_month + @post = Post.new + @post.updated_at = Time.local(2004, 6, 15, 15, 16, 35) + + expected = %{\n" + expected << %{\n} + expected << %{\n} + + expected << " — " + + expected << %{\n" + expected << " : " + expected << %{\n" + + assert_equal expected, datetime_select("post", "updated_at", :discard_month => true) + end + + def test_datetime_select_discard_year_and_month + @post = Post.new + @post.updated_at = Time.local(2004, 6, 15, 15, 16, 35) + + expected = %{\n} + expected << %{\n} + expected << %{\n} + + expected << %{\n" + expected << " : " + expected << %{\n" + + assert_equal expected, datetime_select("post", "updated_at", :discard_year => true, :discard_month => true) + end + + def test_datetime_select_invalid_order + @post = Post.new + @post.updated_at = Time.local(2004, 6, 15, 15, 16, 35) + + expected = %{\n" + expected << %{\n" + expected << %{\n" + + expected << " — " + + expected << %{\n" + expected << " : " + expected << %{\n" + + assert_equal expected, datetime_select("post", "updated_at", :order => [:minute, :day, :hour, :month, :year, :second]) + end + + def test_datetime_select_discard_with_order + @post = Post.new + @post.updated_at = Time.local(2004, 6, 15, 15, 16, 35) + + expected = %{\n} + expected << %{\n" + expected << %{\n" + + expected << " — " + + expected << %{\n" + expected << " : " + expected << %{\n" + + assert_equal expected, datetime_select("post", "updated_at", :order => [:day, :month]) + end end