diff --git a/spec/cache_spec.lua b/spec/cache_spec.lua new file mode 100644 index 0000000..f1cbe08 --- /dev/null +++ b/spec/cache_spec.lua @@ -0,0 +1,108 @@ +describe('cp.cache', function() + local cache + + before_each(function() + cache = require('cp.cache') + cache.load() + end) + + after_each(function() + cache.clear_contest_data('atcoder', 'test_contest') + cache.clear_contest_data('codeforces', 'test_contest') + cache.clear_contest_data('cses', 'test_contest') + end) + + describe('load and save', function() + it('loads without error when cache file exists', function() + assert.has_no_errors(function() + cache.load() + end) + end) + + it('saves and persists data', function() + local problems = { { id = 'A', name = 'Problem A' } } + + assert.has_no_errors(function() + cache.set_contest_data('atcoder', 'test_contest', problems) + end) + + local result = cache.get_contest_data('atcoder', 'test_contest') + assert.is_not_nil(result) + assert.equals('A', result.problems[1].id) + end) + end) + + describe('contest data', function() + it('stores and retrieves contest data', function() + local problems = { + { id = 'A', name = 'First Problem' }, + { id = 'B', name = 'Second Problem' } + } + + cache.set_contest_data('codeforces', 'test_contest', problems) + local result = cache.get_contest_data('codeforces', 'test_contest') + + assert.is_not_nil(result) + assert.equals(2, #result.problems) + assert.equals('A', result.problems[1].id) + assert.equals('Second Problem', result.problems[2].name) + end) + + it('returns nil for missing contest', function() + local result = cache.get_contest_data('atcoder', 'nonexistent_contest') + assert.is_nil(result) + end) + + it('clears contest data', function() + local problems = { { id = 'A' } } + cache.set_contest_data('atcoder', 'test_contest', problems) + + cache.clear_contest_data('atcoder', 'test_contest') + local result = cache.get_contest_data('atcoder', 'test_contest') + + assert.is_nil(result) + end) + + it('handles cses expiry correctly', function() + local problems = { { id = 'A' } } + cache.set_contest_data('cses', 'test_contest', problems) + + local result = cache.get_contest_data('cses', 'test_contest') + assert.is_not_nil(result) + assert.is_not_nil(result.expires_at) + end) + end) + + describe('test cases', function() + it('stores and retrieves test cases', function() + local test_cases = { + { index = 1, input = '1 2', expected = '3' }, + { index = 2, input = '4 5', expected = '9' } + } + + cache.set_test_cases('atcoder', 'test_contest', 'A', test_cases) + local result = cache.get_test_cases('atcoder', 'test_contest', 'A') + + assert.is_not_nil(result) + assert.equals(2, #result) + assert.equals('1 2', result[1].input) + assert.equals('9', result[2].expected) + end) + + it('handles contest-level test cases', function() + local test_cases = { { input = 'test', expected = 'output' } } + + cache.set_test_cases('cses', 'test_contest', nil, test_cases) + local result = cache.get_test_cases('cses', 'test_contest', nil) + + assert.is_not_nil(result) + assert.equals(1, #result) + assert.equals('test', result[1].input) + end) + + it('returns nil for missing test cases', function() + local result = cache.get_test_cases('atcoder', 'nonexistent', 'A') + assert.is_nil(result) + end) + end) +end) \ No newline at end of file diff --git a/spec/command_parsing_spec.lua b/spec/command_parsing_spec.lua new file mode 100644 index 0000000..0774c8c --- /dev/null +++ b/spec/command_parsing_spec.lua @@ -0,0 +1,63 @@ +describe('cp command parsing', function() + local cp + + before_each(function() + cp = require('cp') + cp.setup() + end) + + describe('contest commands', function() + it('parses contest selection command', function() + end) + + it('validates contest parameters', function() + end) + + it('handles invalid contest names', function() + end) + end) + + describe('problem commands', function() + it('parses problem selection command', function() + end) + + it('handles problem identifiers correctly', function() + end) + + it('validates problem parameters', function() + end) + end) + + describe('scraping commands', function() + it('parses scrape command with platform', function() + end) + + it('handles platform-specific parameters', function() + end) + + it('validates scraper availability', function() + end) + end) + + describe('test commands', function() + it('parses test execution command', function() + end) + + it('handles test navigation commands', function() + end) + + it('parses test panel commands', function() + end) + end) + + describe('error handling', function() + it('handles malformed commands gracefully', function() + end) + + it('provides helpful error messages', function() + end) + + it('suggests corrections for typos', function() + end) + end) +end) \ No newline at end of file diff --git a/spec/execute_spec.lua b/spec/execute_spec.lua new file mode 100644 index 0000000..700b5ca --- /dev/null +++ b/spec/execute_spec.lua @@ -0,0 +1,65 @@ +describe('cp.execute', function() + local execute + + before_each(function() + execute = require('cp.execute') + end) + + describe('compilation', function() + it('compiles cpp files correctly', function() + end) + + it('handles compilation errors gracefully', function() + end) + + it('uses correct compiler flags', function() + end) + end) + + describe('test execution', function() + it('runs tests against sample input', function() + end) + + it('captures program output correctly', function() + end) + + it('handles execution timeouts', function() + end) + + it('detects runtime errors', function() + end) + end) + + describe('result comparison', function() + it('compares output with expected results', function() + end) + + it('handles whitespace differences correctly', function() + end) + + it('reports differences clearly', function() + end) + end) + + describe('debug mode execution', function() + it('runs programs with debug flags', function() + end) + + it('provides debugging information', function() + end) + + it('handles debug mode timeouts', function() + end) + end) + + describe('batch execution', function() + it('runs multiple test cases sequentially', function() + end) + + it('reports aggregate results', function() + end) + + it('stops on first failure when configured', function() + end) + end) +end) \ No newline at end of file diff --git a/spec/health_spec.lua b/spec/health_spec.lua new file mode 100644 index 0000000..51fef2d --- /dev/null +++ b/spec/health_spec.lua @@ -0,0 +1,51 @@ +describe('cp.health', function() + local health + + before_each(function() + health = require('cp.health') + end) + + describe('dependency checks', function() + it('checks for python availability', function() + end) + + it('validates scraper dependencies', function() + end) + + it('checks uv installation', function() + end) + end) + + describe('scraper validation', function() + it('validates codeforces scraper', function() + end) + + it('validates atcoder scraper', function() + end) + + it('validates cses scraper', function() + end) + end) + + describe('configuration validation', function() + it('checks config file validity', function() + end) + + it('validates language configurations', function() + end) + + it('checks snippet configurations', function() + end) + end) + + describe('system checks', function() + it('checks file permissions', function() + end) + + it('validates cache directory access', function() + end) + + it('checks network connectivity', function() + end) + end) +end) \ No newline at end of file diff --git a/spec/integration_spec.lua b/spec/integration_spec.lua new file mode 100644 index 0000000..67b4770 --- /dev/null +++ b/spec/integration_spec.lua @@ -0,0 +1,74 @@ +describe('cp integration', function() + local cp + + before_each(function() + cp = require('cp') + cp.setup() + end) + + describe('full workflow', function() + it('handles complete contest setup workflow', function() + end) + + it('integrates scraping with problem creation', function() + end) + + it('coordinates between modules correctly', function() + end) + end) + + describe('scraper integration', function() + it('integrates with python scrapers correctly', function() + end) + + it('handles scraper communication properly', function() + end) + + it('processes scraper output correctly', function() + end) + end) + + describe('buffer coordination', function() + it('manages multiple buffers correctly', function() + end) + + it('coordinates window layouts properly', function() + end) + + it('handles buffer state consistency', function() + end) + end) + + describe('cache and persistence', function() + it('maintains data consistency across sessions', function() + end) + + it('handles concurrent access properly', function() + end) + + it('recovers from interrupted operations', function() + end) + end) + + describe('error propagation', function() + it('handles errors across module boundaries', function() + end) + + it('provides coherent error messages', function() + end) + + it('maintains system stability on errors', function() + end) + end) + + describe('performance', function() + it('handles large contest data efficiently', function() + end) + + it('manages memory usage appropriately', function() + end) + + it('maintains responsiveness during operations', function() + end) + end) +end) \ No newline at end of file diff --git a/spec/problem_spec.lua b/spec/problem_spec.lua new file mode 100644 index 0000000..dc038a3 --- /dev/null +++ b/spec/problem_spec.lua @@ -0,0 +1,51 @@ +describe('cp.problem', function() + local problem + + before_each(function() + problem = require('cp.problem') + end) + + describe('problem creation', function() + it('creates problem files with correct naming', function() + end) + + it('applies language-specific templates', function() + end) + + it('sets up directory structure correctly', function() + end) + end) + + describe('problem metadata', function() + it('extracts problem information correctly', function() + end) + + it('handles missing metadata gracefully', function() + end) + + it('validates problem identifiers', function() + end) + end) + + describe('file management', function() + it('creates solution files in correct locations', function() + end) + + it('handles existing files appropriately', function() + end) + + it('manages backup files correctly', function() + end) + end) + + describe('buffer setup', function() + it('opens problem files in appropriate buffers', function() + end) + + it('sets correct buffer options', function() + end) + + it('applies filetype-specific settings', function() + end) + end) +end) \ No newline at end of file diff --git a/spec/scraper_spec.lua b/spec/scraper_spec.lua new file mode 100644 index 0000000..9860e2c --- /dev/null +++ b/spec/scraper_spec.lua @@ -0,0 +1,74 @@ +describe('cp.scrape', function() + local scrape + + before_each(function() + scrape = require('cp.scrape') + end) + + describe('platform detection', function() + it('detects codeforces contests correctly', function() + end) + + it('detects atcoder contests correctly', function() + end) + + it('detects cses problems correctly', function() + end) + + it('handles invalid contest identifiers', function() + end) + end) + + describe('metadata scraping', function() + it('retrieves contest metadata from scrapers', function() + end) + + it('parses problem lists correctly', function() + end) + + it('handles scraper failures gracefully', function() + end) + + it('validates scraped data structure', function() + end) + end) + + describe('test case scraping', function() + it('retrieves test cases for problems', function() + end) + + it('handles missing test cases', function() + end) + + it('validates test case format', function() + end) + + it('processes multiple test cases correctly', function() + end) + end) + + describe('cache integration', function() + it('stores scraped data in cache', function() + end) + + it('retrieves cached data when available', function() + end) + + it('respects cache expiry settings', function() + end) + + it('handles cache invalidation correctly', function() + end) + end) + + describe('error handling', function() + it('handles network connectivity issues', function() + end) + + it('reports scraper execution errors', function() + end) + + it('provides meaningful error messages', function() + end) + end) +end) \ No newline at end of file diff --git a/spec/snippets_spec.lua b/spec/snippets_spec.lua new file mode 100644 index 0000000..d2eb896 --- /dev/null +++ b/spec/snippets_spec.lua @@ -0,0 +1,51 @@ +describe('cp.snippets', function() + local snippets + + before_each(function() + snippets = require('cp.snippets') + end) + + describe('snippet loading', function() + it('loads default snippets correctly', function() + end) + + it('loads user snippets from config', function() + end) + + it('handles missing snippet files gracefully', function() + end) + end) + + describe('snippet expansion', function() + it('expands basic templates correctly', function() + end) + + it('handles language-specific snippets', function() + end) + + it('processes snippet placeholders', function() + end) + end) + + describe('template generation', function() + it('generates cpp templates', function() + end) + + it('generates python templates', function() + end) + + it('applies contest-specific templates', function() + end) + end) + + describe('buffer integration', function() + it('inserts snippets into current buffer', function() + end) + + it('positions cursor correctly after expansion', function() + end) + + it('handles multiple snippet insertions', function() + end) + end) +end) \ No newline at end of file diff --git a/spec/test_panel_spec.lua b/spec/test_panel_spec.lua new file mode 100644 index 0000000..e05cebc --- /dev/null +++ b/spec/test_panel_spec.lua @@ -0,0 +1,83 @@ +describe('cp test panel', function() + local cp + + before_each(function() + cp = require('cp') + cp.setup() + vim.cmd('silent! %bwipeout!') + end) + + after_each(function() + vim.cmd('silent! %bwipeout!') + end) + + describe('panel creation', function() + it('creates test panel buffers', function() + end) + + it('sets up correct window layout', function() + end) + + it('applies correct buffer settings', function() + end) + + it('sets up keymaps correctly', function() + end) + end) + + describe('test case display', function() + it('renders test case tabs correctly', function() + end) + + it('displays input correctly', function() + end) + + it('displays expected output correctly', function() + end) + + it('displays actual output correctly', function() + end) + + it('shows diff when test fails', function() + end) + end) + + describe('navigation', function() + it('navigates to next test case', function() + end) + + it('navigates to previous test case', function() + end) + + it('wraps around at boundaries', function() + end) + + it('updates display on navigation', function() + end) + end) + + describe('test execution integration', function() + it('compiles and runs tests automatically', function() + end) + + it('updates results in real-time', function() + end) + + it('handles compilation failures', function() + end) + + it('shows execution time', function() + end) + end) + + describe('session management', function() + it('saves and restores session correctly', function() + end) + + it('handles multiple panels gracefully', function() + end) + + it('cleans up resources on close', function() + end) + end) +end) \ No newline at end of file