# POST /achievements
# POST /achievements.json
def create
+ split_result! params[:achievement]
@achievement = Achievement.new(params[:achievement])
@achievement.user = current_user
def update
@achievement = Achievement.find(params[:id])
check_user!
+ split_result! params[:achievement]
respond_to do |format|
if @achievement.update_attributes(params[:achievement])
format.json { render :status => 401, :json => { :error => error } }
end
end
+
+ def split_result!(param)
+ if r = param.delete(:result)
+ param[:results] = r.split(',').map &:to_i
+ end
+ end
end
class Achievement < ActiveRecord::Base
belongs_to :user
belongs_to :task
- attr_accessible :result
+ attr_accessible :results
attr_accessible :task_id
validates_uniqueness_of :task_id, :scope => :user_id
+
+ def results
+ result.split(',').map(&:to_i)
+ end
+
+ def results=(xs)
+ result_will_change!
+ self.result = xs.join(',')
+ end
+
+ class MergeError < StandardError; end
+
+ def self.merge(xs, ys)
+ if xs.size != ys.size
+ raise MergeError
+ else
+ xs.zip(ys).map &:max
+ end
+ end
end
assert_redirected_to achievement_path(assigns(:achievement))
end
+ test "should normalize result" do
+ assert_difference('Achievement.count') do
+ post :create, :achievement => { :task_id => @alt_achievement.task_id, :result => '1, 2' }
+ end
+ a = assigns :achievement
+ assert_not_nil a
+ assert_equal '1,2', a.result
+ end
+
test "should show achievement" do
get :show, id: @achievement
assert_response :success
post :create, :achievement => { :task_id => @achievement.task_id, :result => @achievement.result }
end
end
+
+ test "should merge results" do
+ xs = @achievement.results
+ ys = Array.new(xs.size) { 0 }
+ ys[0] = 10000
+ put :update, :id => @achievement, :achievement => { :result => ys.join(',') }
+ updated_achievement = assigns :achievement
+ assert_not_nil updated_achievement
+ assert_equal Achievement.merge(xs, ys), updated_achievement.results
+ end
end
require 'test_helper'
class AchievementTest < ActiveSupport::TestCase
- # test "the truth" do
- # assert true
- # end
+ test 'merge ok' do
+ a = [1, 4, 7]
+ b = [2, 0, 10]
+ expected = [2, 4, 10]
+ assert_equal expected, Achievement.merge(a, b)
+ assert_equal expected, Achievement.merge(b, a)
+ end
+
+ test 'merge ng' do
+ a = [1, 4, 7]
+ b = [2, 0]
+ assert_raises(Achievement::MergeError) { Achievement.merge(a, b) }
+ assert_raises(Achievement::MergeError) { Achievement.merge(b, a) }
+ end
end