Created
November 6, 2012 05:25
-
-
Save baya/4022764 to your computer and use it in GitHub Desktop.
状态列表维护
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 用于维护状态列表 | |
# 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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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