dotar/vim/autoload/railmoon/id.vim
2011-11-17 16:00:49 -06:00

116 lines
3.4 KiB
VimL
Executable File

" Author: Mykola Golubyev ( Nickolay Golubev )
" Email: golubev.nikolay@gmail.com
" Home: www.railmoon.com
" Module: railmoon#id
" Purpose: util functions for work with id
"
" -
" [ public library function ]
" Name: railmoon#id#acquire
" Purpose: return new unique id for widget
" [ parameters ]
" pool_name id pool name
" -
function! railmoon#id#acquire(pool_name)
if ! has_key(s:list, a:pool_name)
let s:list[a:pool_name] = []
endif
if ! has_key(s:last_id, a:pool_name)
let s:last_id[a:pool_name] = 0
endif
if empty(s:list[a:pool_name])
let s:last_id[a:pool_name] += 1
call add(s:list[a:pool_name], s:last_id[a:pool_name])
endif
let result = s:list[a:pool_name][0]
let s:list[a:pool_name] = s:list[a:pool_name][1:]
call railmoon#trace#debug('id#acquire pool = '.a:pool_name.'; id = '.result)
return result
endfunction
" -
" [ public library function ]
" Name: railmoon#id#release
" Purpose: return id to pool
" [ parameters ]
" pool_name id pool name
" id id that no longer in use
" -
function! railmoon#id#release(pool_name, id)
call railmoon#trace#debug('id#release pool = '.a:pool_name.'; id = '.a:id)
if index(s:list[a:pool_name], a:id) != -1
throw 'railmoon:id:release:already_present:'.a:id
endif
if a:id > s:last_id[a:pool_name]
throw 'railmoon:id:release:wasnt_acquired'
endif
call add(s:list[a:pool_name], a:id)
endfunction
" -
" [ internal usage ]
" store last widget id
" -
let s:last_id = {}
" -
" [ internal usage ]
" store available ids
" -
let s:list = {}
" -
" Section: unit testing
" -
let s:library_unit_test = railmoon#unit_test#create('railmoon#id test')
function! s:library_unit_test.test_acquire_release()
call self.assert_equal(railmoon#id#acquire('test_id_pool'), 1)
call self.assert_equal(railmoon#id#acquire('test_id_pool'), 2)
call self.assert_equal(railmoon#id#acquire('test_id_pool'), 3)
call self.assert_equal(railmoon#id#acquire('test2_id_pool'), 1)
call self.assert_equal(railmoon#id#acquire('test2_id_pool'), 2)
call self.assert_equal(railmoon#id#acquire('test2_id_pool'), 3)
call railmoon#id#release('test_id_pool', 3)
call self.assert_equal(railmoon#id#acquire('test_id_pool'), 3)
call railmoon#id#release('test2_id_pool', 3)
call self.assert_equal(railmoon#id#acquire('test2_id_pool'), 3)
call railmoon#id#release('test_id_pool', 2)
call self.assert_equal(railmoon#id#acquire('test_id_pool'), 2)
call railmoon#id#release('test_id_pool', 1)
call self.assert_equal(railmoon#id#acquire('test_id_pool'), 1)
call self.assert_equal(railmoon#id#acquire('test_id_pool'), 4)
call self.assert_equal(railmoon#id#acquire('test_id_pool'), 5)
call self.assert_equal(railmoon#id#acquire('test_id_pool'), 6)
call railmoon#id#release('test_id_pool', 1)
call self.assert_equal(railmoon#id#acquire('test_id_pool'), 1)
call railmoon#id#release('test_id_pool', 1)
call railmoon#id#release('test_id_pool', 2)
call railmoon#id#release('test_id_pool', 3)
call railmoon#id#release('test_id_pool', 4)
call railmoon#id#release('test_id_pool', 5)
call railmoon#id#release('test_id_pool', 6)
endfunction
function! s:library_unit_test.test_acquire_release_case_1()
call self.assert_equal(railmoon#id#acquire('test_acquire_release_case_1'), 1)
call railmoon#id#release('test_acquire_release_case_1', 1)
endfunction
call s:library_unit_test.run()