Skip to content

Instantly share code, notes, and snippets.

@baya
Created November 6, 2012 05:25
Show Gist options
  • Save baya/4022764 to your computer and use it in GitHub Desktop.
Save baya/4022764 to your computer and use it in GitHub Desktop.
状态列表维护
# 用于维护状态列表
# Example:
#
# sm = StatusMapper.new({
# '购买彩票失败' => '-3',
# '默认' => ['-1', '未做任何处理'],
# '投注成功' => '0',
# '购买彩票成功' => '1'
# })
# sm['默认'].code #=> '-1'
# sm['默认'].note #=> '未做任何处理'
# sm['默认'].name #=> '默认'
# item = sm.find_by_code('-1')
# item.note #=> '未做任何处理'
# item.code #=> '-1'
# item.name #=> '默认'
class StatusMapper
attr_reader :raw
def initialize h = {}
@status = {}
@items = []
@raw = h
@data = nil
h.each {|k, v|
v = [v] if !v.is_a? Array
name = k
code = v[0]
note = v[1].nil? ? name : v[1]
item = OpenStruct.new(name: name, code: code, note: note)
@status[k] = item
@items << item
}
@enum = @items.to_enum
end
def [](*names)
@data = names.map {|name| @status[name] }
self
end
def code
@data.first.code
end
def name
@data.first.name
end
def note
@data.first.note
end
def codes
@data.map(&:code)
end
def find_by_code(code)
@items.detect {|item| item.code == code }
end
def each
@enum.each {|item| yield item }
end
end
@baya
Copy link
Author

baya commented Nov 6, 2012

require 'test_helper'

class StatusMapperTest < ActiveSupport::TestCase

def setup
@sm = StatusMapper.new({
'购买彩票失败' => '-3',
'默认' => ['-1', '未做任何处理'],
'投注成功' => '0',
'购买彩票成功' => '1'
})

end

test '#code' do
assert_equal @sm['默认'].code, '-1'
assert_equal @sm['购买彩票失败'].code, '-3'
assert_equal @sm['投注成功'].code, '0'
assert_equal @sm['购买彩票成功'].code, '1'
end

test '#codes' do
assert_equal @sm['默认', '投注成功'].codes, ['-1', '0']
assert_equal @sm['购买彩票失败', '投注成功'].codes, ['-3', '0']
assert_equal @sm['投注成功', '默认', '购买彩票成功'].codes, ['0', '-1', '1']
assert_equal @sm['购买彩票成功', '默认', '投注成功', '购买彩票失败'].codes, ['1', '-1', '0', '-3']
end

test '#name' do
assert_equal @sm['默认'].name, '默认'
assert_equal @sm['购买彩票失败'].name, '购买彩票失败'
assert_equal @sm['投注成功'].name, '投注成功'
assert_equal @sm['购买彩票成功'].name, '购买彩票成功'
end

test '#note' do
assert_equal @sm['默认'].note, '未做任何处理'
assert_equal @sm['购买彩票失败'].note, '购买彩票失败'
assert_equal @sm['投注成功'].name, '投注成功'
assert_equal @sm['购买彩票成功'].name, '购买彩票成功'
end

test '#find_by_code' do
item = @sm.find_by_code('-3')
assert_equal item.name, '购买彩票失败'
assert_equal item.note, '购买彩票失败'
assert_equal item.code, '-3'
end

end

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment