Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
67 changes: 67 additions & 0 deletions tests/cpp/integration/oop_mid1_correct.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
#include <iostream>
#include <string>

class User {
private:
static int nextId;
static int usersCount;

const int id;
std::string username;

public:
User(const std::string& username) : id(nextId), username(username) {
++nextId;
++usersCount;
}

~User() {
--usersCount;
}

static int getUsersCount() {
return usersCount;
}

int getId() const {
return id;
}

std::string getName() const {
return username;
}

void setName(const std::string& newName) {
username = newName;
}
};

int User::nextId = 1;
int User::usersCount = 0;

int main() {
std::cout << User::getUsersCount() << std::endl;

User alice("Alice");
User bob("Bob");
User charlie("Charlie");

std::cout << User::getUsersCount() << std::endl;

std::cout << alice.getId() << std::endl;
std::cout << bob.getId() << std::endl;
std::cout << charlie.getId() << std::endl;

charlie.setName("Charles");

std::cout << charlie.getName() << std::endl;

{
User bobCopy("Bob");
std::cout << User::getUsersCount() << std::endl;
}

std::cout << User::getUsersCount() << std::endl;

return 0;
}
63 changes: 63 additions & 0 deletions tests/cpp/integration/oop_mid1_incorrect.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
#include <iostream>
#include <string>

class User {
private:
static int nextId;
static int usersCount;

const int id;
std::string username;

public:
User(const std::string& username) : id(nextId++), username(username) {
++usersCount;
}

static int getUsersCount() {
return usersCount;
}

int getId() const {
return id;
}

std::string getName() const {
return username;
}

void setName(const std::string& newName) {
username = newName;
}
};

int User::nextId = 1;
int User::usersCount = 0;


int main() {
std::cout << User::getUsersCount() << std::endl;

User alice("Alice");
User bob("Bob");
User charlie("Charlie");

std::cout << User::getUsersCount() << std::endl;

std::cout << alice.getId() << std::endl;
std::cout << bob.getId() << std::endl;
std::cout << charlie.getId() << std::endl;

charlie.setName("Charles");

std::cout << charlie.getName() << std::endl;

{
User bobCopy("Bob");
std::cout << User::getUsersCount() << std::endl;
}

std::cout << User::getUsersCount() << std::endl;

return 0;
}
62 changes: 62 additions & 0 deletions tests/cpp/integration/oop_mid2_correct.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
#include <iostream>
#include <numeric>
#include <stdexcept>

class Fraction {
private:
int numerator;
int denominator;

void simplify() {
int gcd = std::gcd(numerator, denominator);
numerator /= gcd;
denominator /= gcd;

if (denominator < 0) {
numerator = -numerator;
denominator = -denominator;
}
}

public:
Fraction(int num, int den) : numerator(num), denominator(den) {
if (denominator == 0) {
throw std::invalid_argument("Denominator cannot be zero");
}
simplify();
}

Fraction operator*(const Fraction& other) const {
return Fraction(numerator * other.numerator, denominator * other.denominator);
}

Fraction operator+(const Fraction& other) const {
return Fraction(numerator * other.denominator + other.numerator * denominator,
denominator * other.denominator);
}

friend std::ostream& operator<<(std::ostream& os, const Fraction& f) {
os << f.numerator << "/" << f.denominator;
return os;
}
};


int main() {
Fraction f1(1, 2);
Fraction f2(3, 4);

Fraction sum = f1 + f2;
Fraction product = f1 * f2;

std::cout << sum << std::endl;
std::cout << product << std::endl;

Fraction f3(2, 4);
std::cout << f3 << std::endl;

Fraction f4(3, -6);
std::cout << f4 << std::endl;

return 0;
}
60 changes: 60 additions & 0 deletions tests/cpp/integration/oop_mid2_incorrect.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
#include <iostream>
#include <numeric>
#include <stdexcept>

class Fraction {
private:
int numerator;
int denominator;

void simplify() {
int gcd = std::gcd(numerator, denominator);
numerator /= gcd;
denominator /= gcd;

if (denominator < 0) {
denominator = -denominator;
}
}

public:
Fraction(int num, int den) : numerator(num), denominator(den) {
if (denominator == 0) {
throw std::invalid_argument("Denominator cannot be zero");
}
simplify();
}

Fraction operator*(const Fraction& other) const {
return Fraction(numerator * other.numerator, denominator * other.denominator);
}

Fraction operator+(const Fraction& other) const {
return Fraction(numerator * other.denominator + other.numerator * denominator,
denominator * other.denominator);
}

friend std::ostream& operator<<(std::ostream& os, const Fraction& f) {
os << f.numerator << "/" << f.denominator;
return os;
}
};

int main() {
Fraction f1(1, 2);
Fraction f2(3, 4);

Fraction sum = f1 + f2;
Fraction product = f1 * f2;

std::cout << sum << std::endl;
std::cout << product << std::endl;

Fraction f3(2, 4);
std::cout << f3 << std::endl;

Fraction f4(3, -6);
std::cout << f4 << std::endl;

return 0;
}
113 changes: 50 additions & 63 deletions workshop/main.py
Original file line number Diff line number Diff line change
@@ -1,63 +1,50 @@
import argparse
import sys
import inspect
from src import c_course, cpp_course
import os



def init_task(task: c_course.BaseTaskClass):
print(task.init_task())


def check_task(task: c_course.BaseTaskClass, solfile: str, name: str):
passed, msg = task.check()
print("Passed:", passed)
print(msg)
if passed:
sys.exit(0)

sys.exit(1)


def dry_run_task(task: c_course.BaseTaskClass):
task.generate_task()
task._generate_tests()
for i, test in enumerate(task.tests):
print(f"TEST #{i + 1}:\n\t{test}")
sys.exit(1)


if __name__ == "__main__":
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(required=True)

course_modules = [
c_course,
importlib.import_module("src.c++_course"),
]
cli_parsers = []
for course_module in course_modules:
cli_parsers.extend(
cli_parser
for _, cli_parser in inspect.getmembers(course_module, lambda obj: isinstance(obj, c_course.CLIParser))
)

for cli_parser in cli_parsers:
task_parser = subparsers.add_parser(cli_parser.name)
cli_parser.add_cli_args(task_parser)

# Регистратор для cpp задачек
for cli_parser in cpp_course.PARSERS:
task_parser = subparsers.add_parser(cli_parser.name)
cli_parser.add_cli_args(task_parser)

args = parser.parse_args()
task = args.func(args)
match args.mode:
case "init":
init_task(task)
case "check":
check_task(task)
case "dry-run":
dry_run_task(task)
import argparse
import sys
from src import c_course, cpp_course



def init_task(task: c_course.BaseTaskClass):
print(task.init_task())


def check_task(task: c_course.BaseTaskClass):
passed, msg = task.check()
print("Passed:", passed)
print(msg)
if passed:
sys.exit(0)

sys.exit(1)


def dry_run_task(task: c_course.BaseTaskClass):
task.generate_task()
task._generate_tests()
for i, test in enumerate(task.tests):
print(f"TEST #{i + 1}:\n\t{test}")
sys.exit(1)


if __name__ == "__main__":
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(required=True)

for cli_parser in c_course.PARSERS:
task_parser = subparsers.add_parser(cli_parser.name)
cli_parser.add_cli_args(task_parser)

# Регистратор для cpp задачек
for cli_parser in cpp_course.PARSERS:
task_parser = subparsers.add_parser(cli_parser.name)
cli_parser.add_cli_args(task_parser)

args = parser.parse_args()
task = args.func(args)
match args.mode:
case "init":
init_task(task)
case "check":
check_task(task)
case "dry-run":
dry_run_task(task)
2 changes: 2 additions & 0 deletions workshop/src/cpp_course/oop_mid1/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from .oop_mid1_test import OopMid1Test
from .oop_mid1_cli import oop_mid_1_parser
18 changes: 18 additions & 0 deletions workshop/src/cpp_course/oop_mid1/oop_mid1_cli.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
from ...base_module.base_cli import add_common_cli_args, get_common_cli_args, CLIParser
from .oop_mid1_test import OopMid1Test


def add_cli_args_oop_mid_1(parser):
add_common_cli_args(parser)
parser.set_defaults(func=create_task_oop_mid_1)


def create_task_oop_mid_1(args):
common_args = get_common_cli_args(args)
return OopMid1Test(**common_args)


oop_mid_1_parser = CLIParser(
name='oop_mid1',
add_cli_args=add_cli_args_oop_mid_1
)
Loading