OSDN Git Service

Implement results merge
authoreagletmt <eagletmt@gmail.com>
Fri, 27 Jul 2012 09:32:16 +0000 (18:32 +0900)
committereagletmt <eagletmt@gmail.com>
Fri, 27 Jul 2012 09:32:16 +0000 (18:32 +0900)
CutenServer/app/controllers/achievements_controller.rb
CutenServer/app/models/achievement.rb
CutenServer/test/functional/achievements_controller_test.rb
CutenServer/test/unit/achievement_test.rb

index 4bb7076..1c44a3f 100644 (file)
@@ -48,6 +48,7 @@ class AchievementsController < ApplicationController
   # POST /achievements
   # POST /achievements.json
   def create
+    split_result! params[:achievement]
     @achievement = Achievement.new(params[:achievement])
     @achievement.user = current_user
 
@@ -67,6 +68,7 @@ class AchievementsController < ApplicationController
   def update
     @achievement = Achievement.find(params[:id])
     check_user!
+    split_result! params[:achievement]
 
     respond_to do |format|
       if @achievement.update_attributes(params[:achievement])
@@ -107,4 +109,10 @@ class AchievementsController < ApplicationController
       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
index 938607d..fc31cb5 100644 (file)
@@ -1,8 +1,27 @@
 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
index c0cb132..a5b7125 100644 (file)
@@ -29,6 +29,15 @@ class AchievementsControllerTest < ActionController::TestCase
     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
@@ -75,4 +84,14 @@ class AchievementsControllerTest < ActionController::TestCase
       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
index 1a2a859..042cbec 100644 (file)
@@ -1,7 +1,18 @@
 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