local test_helper = require('test.test_helper') local mocks = test_helper.mocks local utils = test_helper.utils describe('Cat Module', function() local cat setup(function() cat = require('src.cat.init') end) it('should create cat with default personality', function() local c = cat.createCat(1, 'Test Cat', nil) assert.are.equal(1, c.id) assert.are.equal('Test Cat', c.name) assert.are.equal('social', c.personality.id) end) it('should create cat with custom personality', function() local personality = { id = 'lone_wolf', color = { 0.5, 0.5, 0.6 } } local c = cat.createCat(2, 'Lone Cat', personality) assert.are.equal('lone_wolf', c.personality.id) assert.are.equal(0.5, c.personality.color[1]) end) it('should update cat needs over time', function() local c = cat.createCat(1, 'Test Cat', nil) local oldComfort = c.needs.comfort c:update(1.0) assert.is_true(c.needs.comfort < oldComfort) end) it('should transition to sleep state', function() local c = cat.createCat(1, 'Test Cat', nil) c.needs.comfort = 0.1 c:update(1.0) assert.is_true(c.isSleeping) assert.are.equal('sleep', c.state) end) it('should wake up after sleep timer', function() local c = cat.createCat(1, 'Test Cat', nil) c.needs.comfort = 0.1 c.isSleeping = true c.sleepTimer = 0.5 c:update(1.0) assert.is_false(c.isSleeping) assert.are.equal('idle', c.state) end) it('should move toward target position', function() local c = cat.createCat(1, 'Test Cat', nil) c.targetPosition = { x = 1, y = 0, z = 1 } local oldX = c.position.x local oldZ = c.position.z c.state = 'moving' c:update(0.1) assert.is_true(c.position.x ~= oldX or c.position.z ~= oldZ) end) it('should handle zero distance movement', function() local c = cat.createCat(1, 'Test Cat', nil) c.targetPosition = { x = 0, y = 0, z = 0 } c.position = { x = 0, y = 0, z = 0 } c.state = 'moving' c:update(0.1) assert.is_true(true) -- Should not crash end) it('should seek furniture based on needs', function() mocks.setupFilesystem() require('src.core') local c = cat.createCat(1, 'Test Cat', nil) c.needs.comfort = 0.1 c:aiBehavior() -- Should set targetPosition if furniture found end) it('should check personality compatibility', function() mocks.setupFilesystem() require('src.core') local c1 = cat.createCat(1, 'Test Cat 1', { id = 'social', compatibility = { ['social'] = 0.5 } }) local c2 = cat.createCat(2, 'Test Cat 2', { id = 'social', compatibility = { ['social'] = 0.5 } }) c1.position = { x = 0, y = 0, z = 0 } c2.position = { x = 0.5, y = 0, z = 0 } c1:updateNeeds() assert.is_true(c1.needs.social >= 0.7) end) it('should handle incompatible cats', function() mocks.setupFilesystem() require('src.core') local c1 = cat.createCat(1, 'Test Cat 1', { id = 'lone_wolf', compatibility = { ['social'] = -0.5 } }) local c2 = cat.createCat(2, 'Test Cat 2', { id = 'social' }) c1.position = { x = 0, y = 0, z = 0 } c2.position = { x = 0.5, y = 0, z = 0 } local oldSocial = c1.needs.social c1:updateNeeds() assert.is_true(c1.needs.social < oldSocial) end) it('should pet cat and increase mood', function() local c = cat.createCat(1, 'Test Cat', nil) local oldMood = c.mood c:pet() assert.is_true(c.mood > oldMood) end) it('should serialize cat', function() local c = cat.createCat(1, 'Test Cat', nil) local serialized = c:serialize() assert.are.equal(1, serialized.id) assert.are.equal('Test Cat', serialized.name) assert.are.equal('social', serialized.personalityId) end) it('should deserialize cat', function() mocks.setupFilesystem() require('src.core') local original = cat.createCat(1, 'Test Cat', nil) local serialized = original:serialize() local deserialized = cat.deserialize(serialized) assert.are.equal(original.id, deserialized.id) assert.are.equal(original.name, deserialized.name) end) it('should handle nil personality in deserialize', function() local data = { id = 1, name = 'Test', personalityId = 'invalid', position = { x = 0, y = 0, z = 0 } } local c = cat.deserialize(data) assert.are_not.equal(nil, c) assert.are.equal('social', c.personality.id) end) it('should get cat animation', function() local c = cat.createCat(1, 'Test Cat', nil) local anim = cat.getCatAnimation(c, 0) assert.are.equal('table', type(anim)) assert.are.equal('number', type(anim.bounce)) end) it('should handle nil cat in animation', function() local anim = cat.getCatAnimation(nil, 0) assert.are.equal(0, anim.bounce) end) it('should handle nil input in updateCats', function() cat.updateCats(0.1) assert.is_true(true) -- Should not crash end) end)