123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- -- love.thread
- --------------------------------------------------------------------------------
- --------------------------------------------------------------------------------
- ----------------------------------OBJECTS---------------------------------------
- --------------------------------------------------------------------------------
- --------------------------------------------------------------------------------
- -- Channel (love.thread.newChannel)
- love.test.thread.Channel = function(test)
- -- create channel
- local channel = love.thread.getChannel('test')
- test:assertObject(channel)
- -- setup thread to use
- local threadcode1 = [[
- require("love.timer")
- love.timer.sleep(0.1)
- love.thread.getChannel('test'):push('hello world')
- love.timer.sleep(0.1)
- love.thread.getChannel('test'):push('me again')
- ]]
- local thread1 = love.thread.newThread(threadcode1)
- thread1:start()
- -- check message sent from thread to channel
- local msg1 = channel:demand()
- test:assertEquals('hello world', msg1, 'check 1st message was sent')
- thread1:wait()
- test:assertEquals(1, channel:getCount(), 'check still another message')
- test:assertEquals('me again', channel:peek(), 'check 2nd message pending')
- local msg2 = channel:pop()
- test:assertEquals('me again', msg2, 'check 2nd message was sent')
- channel:clear()
- -- setup another thread for some ping pong
- local threadcode2 = [[
- local function setChannel(channel, value)
- channel:clear()
- return channel:push(value)
- end
- local channel = love.thread.getChannel('test')
- local waiting = true
- local sent = nil
- while waiting == true do
- if sent == nil then
- sent = channel:performAtomic(setChannel, 'ping')
- end
- if channel:hasRead(sent) then
- local msg = channel:demand()
- if msg == 'pong' then
- channel:push(msg)
- waiting = false
- end
- end
- end
- ]]
- -- first we run a thread that will send 1 ping
- local thread2 = love.thread.newThread(threadcode2)
- thread2:start()
- -- we wait for that ping to be sent and then send a pong back
- local msg3 = channel:demand()
- test:assertEquals('ping', msg3, 'check message recieved 1')
- -- thread should be waiting for us, and checking is the ping was read
- channel:supply('pong', 1)
- -- if it was then it should send back our pong and thread should die
- thread2:wait()
- local msg4 = channel:pop()
- test:assertEquals('pong', msg4, 'check message recieved 2')
- test:assertEquals(0, channel:getCount())
- end
- -- Thread (love.thread.newThread)
- love.test.thread.Thread = function(test)
- -- create thread
- local threadcode = [[
- local b = 0
- for a=1,100000 do
- b = b + a
- end
- ]]
- local thread = love.thread.newThread(threadcode)
- test:assertObject(thread)
- -- check thread runs
- thread:start()
- test:assertTrue(thread:isRunning(), 'check started')
- thread:wait()
- test:assertFalse(thread:isRunning(), 'check finished')
- test:assertEquals(nil, thread:getError(), 'check no errors')
- -- check an invalid thread
- local badthreadcode = 'local b = 0\nreturn b + "string" .. 10'
- local badthread = love.thread.newThread(badthreadcode)
- badthread:start()
- badthread:wait()
- test:assertNotNil(badthread:getError())
- end
- --------------------------------------------------------------------------------
- --------------------------------------------------------------------------------
- ----------------------------------METHODS---------------------------------------
- --------------------------------------------------------------------------------
- --------------------------------------------------------------------------------
- -- love.thread.getChannel
- -- @NOTE this is just basic nil checking, objs have their own test method
- love.test.thread.getChannel = function(test)
- test:assertObject(love.thread.getChannel('test'))
- end
- -- love.thread.newChannel
- -- @NOTE this is just basic nil checking, objs have their own test method
- love.test.thread.newChannel = function(test)
- test:assertObject(love.thread.newChannel())
- end
- -- love.thread.newThread
- -- @NOTE this is just basic nil checking, objs have their own test method
- love.test.thread.newThread = function(test)
- test:assertObject(love.thread.newThread('classes/TestSuite.lua'))
- end
|