CP Tools is a helper extension for competitive programmers that use VSCode :)
Shortcut: Ctrl+Alt+B
Command: cp-tools.buildAndRun
Builds and runs the code on a user created set of test cases. Output is displayed in a user friendly format, along with useful information such as exit status, execution time, memory used, etc. The output can be directly viewed in the webview panel, but can also be converted to text form. Additionally, expected output can be supplied, and the actual input will be compared against it (the extension also supports automatically diffing the actual and expected outputs).
Note: it is recommended not to close the webview panel after running, as opening the webview itself takes some time and the extension reuses webview panels when running
There are some additional features to make manipulation and navigation easier:
Assuming a test case is selected (for looking at full info), pressing a
will shift you back a test case, while pressing d
will shift you forward. You can also press shift+a
to navigate to the first test case and shift+d
to navigate to the last.
Waiting
: Case is waiting to be judgedJudging
: Case is being judgedSkipped
: Case was skipped. Either there was a fatal compile error or all cases were halted by the userCorrect
: Correct outputMaybe
: The test case didn't have an expected output, but the program had a zero exit code. Your output could be wrong, but you would have to check it yourselfIncorrect
: Incorrect outputTimeout
: Program exceeded time limit. However, note that theTimeout
verdict is given anytime a program is killed withSIGTERM
Runtime Error
: Program threw some error (either threw a signal or had a non-zero exit code)Internal Error
: An error occured that is unrelated to your solution. This is usually an issue with a custom checker
Shortcut: Ctrl+Alt+I
Command: cp-tools.openInput
Opens up a menu for manipulating test cases. Test cases are divided into "test sets", and a single test set is used as input for program during execution. While the cases themselves are stored in files, there is support for editing those cases directly in the display, and there is also a console for quick editing of test data.
Additionally, there are some extra features that help making navigating
Besides the console, there are some additional features to make manipulation and navigation easier:
- Pressing
ctrl+r
will reload the info of all test cases, in case one was modified - Pressing
ctrl+s
while a test case is currently selected will save the info of that test case to files.- Also note that test cases automatically save when you switch from one to the next (in the same set)
- Individual test cases can be disabled, they will still be present, but won't be used for testing your program until they're reenabled. This can be useful if you have some stress tests in your test set that you only want to run when
- The
default
test set is not deletable. This is done intentially to allow easy restoration from an invalid state (i.e. When a test set is selected that does not exist)- If the above type of error happens, simply go into the Options display panel and reset the
curTestSet
option, which will change it back to the default test set
- If the above type of error happens, simply go into the Options display panel and reset the
- Custom checkers are also supported!
identical
: Self-explanatoryidenticalNormalized
: Identical but both the expected and actual output will be "normalized". This include:- All CR and CRLF newlines will be converted to LF
- Any whitespace on the ends will be trimmed
tokens
: Outputs are split by whitespace (multiple whitespaces in a row are treated the same as single whitespace) and the resulting arrays are compared. This is also the default checker.float:1e-4
: The same astokens
except each token is converted to a float and compared based on a precision of1e-4
(two numbers are considered the same if their absolute difference is<= 10^-4
). It's worth noting that if any element in either the actual or expected output arrays is not a number, the checker returnsfalse
float:1e-9
: The same asfloat:1e-4
except the precision is1e-9
custom
: Custom checker. A file must be selected for this type of checker
The file selected must meet the following criteria:
- Be
.js
- Have a
check(input: string, output: string, expectedOutput: string, libraryFunctions: CheckerLibraryFunctions) => boolean
function declared in the file (NOT asmodule.exports
). See thesrc/test/samples
folder of this repository for some examples - An
Internal Error
verdict will be given if the checker throws an error
CheckerLibraryFunctions
is an object with the following functions provided for your convenience:
normalizeOutput: (str: string) => string
: Normalizes the given string with the same rules as theidenticalNormalized
checkertokenize: (str: string) => string[]
: Tokenizes the given string with the same rules as thearrayEquals: <T>(a: T[], b: T[]) => boolean
: Returns whether two arrays are equalarrayEqualsFloat: (a: string[], b: string[], eps: number) => boolean
: Effectively does what thefloat:1e-4
andfloat:1e-9
checkers do, but you have to specify your own precision value (eps)
Important note: Using console.log
inside the check
function will print to the VSCode developer console (developer tools)!
Important note #2: Sadly, require()
doesn't work with the check
function yet :(
- listcommands: Lists all commands
- open:
- Usage:
open <in|out>
- Description: Opens the current selected test case (either input or output)
- Aliases:
o
- Usage:
- select:
- Usage:
select <test set>
- Description: Sets the current test set in the display to be
<test set>
- Aliases:
sel
,s
- Usage:
- selectcase:
- Usage:
selectcase <test index>
- Description Sets the current test case to be
<test index>
(in the curren test set) - Aliases:
selcase
,selc
,sc
- Usage:
- insert:
- Usage:
insert <test set>
- Description: Creates a new test set called
<test set>
- Aliases:
ins
,i
- Usage:
- insertcase:
- Usage:
insertcase <test index> [count=1]
- Description: Inserts
[count]
number of new test sets at<test index>
(in the current test set) - Aliases:
inscase
,insc
,ic
- Usage:
- delete:
- Usage:
delete <test set>
- Description: Deletes the test set
<test set>
- Aliases:
del
,d
- Usage:
- deletecase:
- Usage:
deletecase <test index> [count=1]
- Description: Delete [count] number of new test sets at
<test index>
(in the current test set) - Aliases:
delcase
,delc
,dc
- Usage:
- swap:
- Usage:
swap <set 1> <set 2>
- Description: Swaps the test sets
<set 1>
and<set 2>
- Aliases:
sw
- Usage:
- swapcase:
- Usage:
swapcase <index 1> <index 2>
- Description: Swaps the test cases
<index 1>
and<index 2>
(of the current test set) - Aliases:
swcase
,swc
- Usage:
- rename:
- Usage:
rename <old name> <new name>
- Description: Renames the test set
<old name>
to<new name>
- Aliases:
ren
,r
- Usage:
- pushcase:
- Usage:
pushcase [count=1]
- Description: Inserts
[count]
new test cases at the end (of the current test set) - Aliases:
pcase
,pc
- Usage:
- enable:
- Usage:
enable <test index>
- Description: Enables the test case
<test index>
(of the current test set) - Aliases:
en
- Usage:
- disable:
- Usage:
disable <test index>
- Description: Disables the test case
<test index>
(of the current test set) - Aliases:
dis
- Usage:
Command: cp-tools.loadTemplates
Converts a directory of code templates into VSCode snippets. While all files are scanned for templates by default, it can be configured to
For part of a file to be considered a template, it must have the following comments:
//begintemplate <template name>
before the template//endtemplate
after the template- (Optionally)
//description <description>
for a description cp-tools.removeTempFiles
- Some of the other features (i.e. Build and Run) generate temporary files. This command automatically clears all of them in your workspace directory (which is where they're normally generated)
-
copy
command for input display -
Input/Output preview for test data and execution panels
- Not super high priority because I don't have many good ideas on how to do it without too much clutter at this moment
- Priority will change if I do get an idea though
-
Improve readme
-
Parsing test set from single text file (have to invent some kind of format)
-
Adding support for interactors
- The question is, how hard is it to code a separate interactor compared to coding the interactor straight into your solution
- See here for an example
- The question is, how hard is it to code a separate interactor compared to coding the interactor straight into your solution
-
Adding a "live" timer for the execution time of a judging case (not super pertinent as final time is what really matters)
- Small QoL update
-
Options display automatically reloads when the current test set is changed
- It's not like this really matters at all, since the only time you use the options pane to change the current test set is when you're resetting it from an error state
- Very small QoL update
-
FIX: When executing, sometimes the output panel will stay empty and nothing will be output. I think this is due to the extension host sending events before the webview is ready to accept them. Currently, it's a pretty low impact bug seeing as it only happens once per session (of practice) (since webviews are reused), but it's still a bit annoying (and possibly confusing too)
Add a config.json
file in the root directory of your templates... TODO
Shortcut: Ctrl+Alt+O
Command: cp-tools.openOptions
CP Tools uses a separate webview for manipulating configuration data. The UI should be relatively simple and self-exaplanatory to navigate. Hope it's useful!
TODO
Any issue marked with FIX is a bug