Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
5cec4da
Get first c++ judgements up and running
jorg-vr Jul 17, 2024
201d060
Minimize code duplication
jorg-vr Jul 18, 2024
d73aad9
Add runtime error
jorg-vr Jul 18, 2024
d454083
Add support for objects
jorg-vr Jul 19, 2024
5bd19b3
Support echo function
jorg-vr Jul 19, 2024
895fbb7
Add test files
jorg-vr Jul 29, 2024
52a9c8d
Implement test
jorg-vr Jul 29, 2024
d367fe5
Add file function test
jorg-vr Jul 29, 2024
2ec43b9
Add file function test
jorg-vr Jul 29, 2024
7eaad24
Fix isbn exercise
jorg-vr Jul 30, 2024
9a8dde2
Solve isbn list
jorg-vr Aug 2, 2024
ef40fd8
Solve isbn list
jorg-vr Aug 2, 2024
ccf5a85
Solve lotto
jorg-vr Aug 2, 2024
c6a11bf
Solve objects
jorg-vr Aug 2, 2024
c97aacd
Solve objects
jorg-vr Aug 2, 2024
2af1bbc
Solve remove
jorg-vr Aug 2, 2024
ef13853
Solve sum
jorg-vr Aug 2, 2024
866c86f
Fix some tests
jorg-vr Aug 2, 2024
e5ff917
Improve linting
jorg-vr Oct 16, 2024
ac636db
Merge branch 'master' into feat/add-cpp
jorg-vr Feb 26, 2025
d133425
Fix multiple edge cases
jorg-vr Feb 27, 2025
c1841ae
Fix escaped strings testcase
jorg-vr Feb 27, 2025
ad4fba7
Fix specific argument tests
jorg-vr Feb 27, 2025
4598da3
Remove forced string typing
jorg-vr Feb 27, 2025
32010e9
Fix string type as text
jorg-vr Feb 28, 2025
a28267f
Fix types and formatting
jorg-vr Feb 28, 2025
f4b45c1
Don't inherit from C config
jorg-vr Mar 3, 2025
d25f8df
Don't inherrit from C generators.py
jorg-vr Mar 3, 2025
095b812
Improve whitespace layout of result file
jorg-vr Mar 3, 2025
71f063b
Simplify en merge types
jorg-vr Mar 3, 2025
85b3804
Get rid of NULL
jorg-vr Mar 3, 2025
ffbe612
Remove unneeded newlines
jorg-vr Mar 3, 2025
d151e39
Convert vevaluation_result to actual cpp
jorg-vr Mar 3, 2025
54db530
Standardize braces
jorg-vr Mar 3, 2025
94094b8
Simplify write nothing
jorg-vr Mar 3, 2025
b8d41ab
Add cpp for more tests
jorg-vr Mar 3, 2025
43ffd8c
Fix test_crashing_assignment_with_before
jorg-vr Mar 4, 2025
d765a58
Fix divission tests
jorg-vr Mar 4, 2025
45a4c1c
Fix main definition
jorg-vr Mar 4, 2025
c898178
Fix test_assignment_and_use_in_expression
jorg-vr Mar 4, 2025
9bd30de
Fix test_objects_chained
jorg-vr Mar 4, 2025
c480553
Fix test_counter_chained
jorg-vr Mar 4, 2025
7bdca44
Fix test_property_assignment
jorg-vr Mar 4, 2025
018ecf2
Fix linter
jorg-vr Mar 4, 2025
efe23ac
Fix main method signature
jorg-vr Mar 4, 2025
8f09f15
Fix test_generic_exception_correct
jorg-vr Mar 5, 2025
9e1f8c8
Fix test_generic_exception
jorg-vr Mar 5, 2025
9341575
Fix test_specific_oracle_exception_syntax_error
jorg-vr Mar 5, 2025
d92c0aa
Fix test_specific_oracle_exception_runtime_exception
jorg-vr Mar 5, 2025
a511965
Fix test_specific_oracle_exception_wrong_exception
jorg-vr Mar 5, 2025
44cdb39
test_io_function_display_no_multiline_exercise
jorg-vr Mar 5, 2025
4501bc9
Fix basic types testcase
jorg-vr Mar 5, 2025
664372b
Fix advanced types
jorg-vr Mar 5, 2025
6f8c8d7
Fix special number types
jorg-vr Mar 5, 2025
62ae29c
Fix linting
jorg-vr Mar 5, 2025
39f1fc7
fix types
jorg-vr Mar 5, 2025
ff6ac60
Don't use 'using namespace std;'
jorg-vr Mar 5, 2025
0db90b3
Don't use 'using namespace std;'
jorg-vr Mar 5, 2025
9706fb6
Use variants instead of any where possible
jorg-vr Mar 6, 2025
627519d
Test complex type conversion
jorg-vr Mar 6, 2025
6606d7b
Fix test_advanced_types for haskell
jorg-vr Mar 6, 2025
daf3bda
Fix test_unknown_return_typ
jorg-vr Mar 6, 2025
e9ac84e
Compile on non streamable and move to c++20
jorg-vr Mar 7, 2025
20defbb
Avoid use of pointers
jorg-vr Mar 7, 2025
18eb21a
Avoid overzealous casting
jorg-vr Mar 7, 2025
c07ea57
Add support for static functions
jorg-vr Mar 7, 2025
0b1a7ff
Replace c with modern cpp
jorg-vr Mar 10, 2025
a9e3df3
Cleanup stacktrace properly
jorg-vr Mar 10, 2025
f6d64ea
Fix parallel tests
jorg-vr Mar 10, 2025
938eec7
Add jinja test
jorg-vr Mar 10, 2025
03b7e3c
Fix linting
jorg-vr Mar 10, 2025
1ac1037
Undo C changes
jorg-vr Mar 10, 2025
c96a386
Undo C changes
jorg-vr Mar 10, 2025
d3ac593
Clean up
jorg-vr Mar 10, 2025
bb33e5a
Fix csharp test
jorg-vr Mar 10, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -82,3 +82,9 @@ venv-*/
.venv/
node_modules/
result/

# Visual Studio Code
universal-judge.sln
.data/current/python
.data/current/python-packages
.vscode/
3 changes: 2 additions & 1 deletion tested/dsl/schema-strict.json
Original file line number Diff line number Diff line change
Expand Up @@ -778,7 +778,8 @@
"kotlin",
"python",
"runhaskell",
"csharp"
"csharp",
"cpp"
]
},
"message" : {
Expand Down
3 changes: 2 additions & 1 deletion tested/dsl/schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -778,7 +778,8 @@
"kotlin",
"python",
"runhaskell",
"csharp"
"csharp",
"cpp"
]
},
"message" : {
Expand Down
2 changes: 2 additions & 0 deletions tested/languages/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

from tested.languages.bash.config import Bash
from tested.languages.c.config import C
from tested.languages.cpp.config import CPP
from tested.languages.csharp.config import CSharp
from tested.languages.haskell.config import Haskell
from tested.languages.java.config import Java
Expand All @@ -36,6 +37,7 @@
"python": Python,
"runhaskell": RunHaskell,
"csharp": CSharp,
"cpp": CPP,
}


Expand Down
215 changes: 215 additions & 0 deletions tested/languages/cpp/config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,215 @@
import re
from pathlib import Path

from tested.datatypes import AllTypes
from tested.dodona import AnnotateCode, Message
from tested.features import Construct, TypeSupport
from tested.languages.conventionalize import (
Conventionable,
NamingConventions,
submission_file,
)
from tested.languages.cpp.generators import CPPGenerator
from tested.languages.language import (
CallbackResult,
Command,
Language,
TypeDeclarationMetadata,
)
from tested.languages.preparation import PreparedExecutionUnit
from tested.languages.utils import executable_name
from tested.serialisation import Statement, Value


class CPP(Language):
def initial_dependencies(self) -> list[str]:
return [
"values.h",
"values.cpp",
"values.tpp",
"evaluation_result.h",
"evaluation_result.cpp",
]

def needs_selector(self):
return True

def file_extension(self) -> str:
return "cpp"

def comment(self, text: str) -> str:
return f"// {text}"

Check warning on line 41 in tested/languages/cpp/config.py

View check run for this annotation

Codecov / codecov/patch

tested/languages/cpp/config.py#L41

Added line #L41 was not covered by tests

def naming_conventions(self) -> dict[Conventionable, NamingConventions]:
return {
"identifier": "camel_case",
"property": "camel_case",
"class": "pascal_case",
"global_identifier": "macro_case",
}

def supported_constructs(self) -> set[Construct]:
return {
Construct.FUNCTION_CALLS,
Construct.ASSIGNMENTS,
Construct.GLOBAL_VARIABLES,
Construct.OBJECTS,
Construct.HETEROGENEOUS_COLLECTIONS,
Construct.DEFAULT_PARAMETERS,
Construct.HETEROGENEOUS_ARGUMENTS,
Construct.EXCEPTIONS,
}

def datatype_support(self) -> dict[AllTypes, TypeSupport]:
return { # type: ignore
"integer": "supported",
"real": "supported",
"char": "supported",
"text": "supported",
"string": "supported",
"boolean": "supported",
"nothing": "supported",
"undefined": "reduced",
"null": "reduced",
"int8": "supported",
"uint8": "supported",
"int16": "supported",
"uint16": "supported",
"int32": "supported",
"uint32": "supported",
"int64": "supported",
"uint64": "supported",
"single_precision": "supported",
"double_precision": "supported",
"double_extended": "supported",
"sequence": "supported",
"set": "supported",
"map": "supported",
"dictionary": "supported",
"object": "reduced",
"array": "supported",
"list": "supported",
"tuple": "supported",
}

def compilation(self, files: list[str]) -> CallbackResult:
main_file = files[-1]
exec_file = Path(main_file).stem
result = executable_name(exec_file)
assert self.config
return (
[
"g++",
"-std=c++20",
"-Wall",
"-O3" if self.config.options.compiler_optimizations else "-O0",
"evaluation_result.cpp",
"values.cpp",
main_file,
"-o",
result,
],
[result],
)

def execution(self, cwd: Path, file: str, arguments: list[str]) -> Command:
local_file = cwd / executable_name(Path(file).stem)
return [str(local_file.absolute()), *arguments]

def modify_solution(self, solution: Path):
with open(solution, "r") as file:
contents = file.read()
# We use regex to find the main function.
# First, check if we have a no-arg main function.
# If so, replace it with a renamed main function that does have args.
no_args = re.compile(r"(int|void)(\s+)main(\s*)\((\s*)\)(\s*{)")
replacement = r"int\2solution_main\3(\4int argc, char* argv[])\5"
contents, nr = re.subn(no_args, replacement, contents, count=1)
if nr == 0:
# There was no main function without arguments. Now we try a main
# function with arguments.
with_args = re.compile(r"(int|void)(\s+)main(\s*)\((\s*)int")
replacement = r"int\2solution_main\3(\4int"
contents = re.sub(with_args, replacement, contents, count=1)
with open(solution, "w") as file:
header = "#pragma once\n\n"
file.write(header + contents)

def linter(self, remaining: float) -> tuple[list[Message], list[AnnotateCode]]:
# Import locally to prevent errors.
from tested.languages.c import linter

assert self.config
return linter.run_cppcheck(self.config.dodona, remaining, "c++")

def cleanup_stacktrace(self, stacktrace: str) -> str:
result = ""
in_student_file = False
for line in stacktrace.splitlines(keepends=True):
if submission_file(self) in line:
in_student_file = True
elif "|" not in line:
in_student_file = False

if in_student_file:
line = line.replace(submission_file(self), "<code>")
result += line
return result

def is_source_file(self, file: Path) -> bool:
return file.suffix in (".cpp", ".h", ".tpp")

def generator(self) -> CPPGenerator:
return CPPGenerator(self.file_extension())

def generate_statement(self, statement: Statement) -> str:
return self.generator().convert_statement(statement)

def generate_execution_unit(self, execution_unit: "PreparedExecutionUnit") -> str:
return self.generator().convert_execution_unit(execution_unit)

def generate_selector(self, contexts: list[str]) -> str:
return self.generator().convert_selector(contexts)

def generate_encoder(self, values: list[Value]) -> str:
return self.generator().convert_encoder(values)

def get_declaration_metadata(self) -> TypeDeclarationMetadata:
return {
"names": { # type: ignore
"integer": "int",
"real": "double",
"char": "char",
"text": "std::string",
"string": "std::string",
"boolean": "bool",
"nothing": "void",
"undefined": "void",
"int8": "std::int8_t",
"uint8": "std::uint8_t",
"int16": "std::int16_t",
"uint16": "std::uint16_t",
"int32": "std::int32_t",
"uint32": "std::uint32_t",
"int64": "std::int64_t",
"uint64": "std::uint64_t",
"bigint": "std::intmax_t",
"single_precision": "float",
"double_precision": "double",
"any": "std::any",
"sequence": "std::vector",
"array": "std::vector",
"list": "std::list",
"tuple": "std::tuple",
"set": "std::set",
"map": "std::map",
},
"nested": ("<", ">"),
"exception": "std::exception_ptr",
}

def is_void_method(self, name: str) -> bool:
assert self.config
regex = rf"void\s+{name}"
the_source = self.config.dodona.source.read_text()
return re.search(regex, the_source) is not None
Loading
Loading