Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support testlib SPJ for grader #168

Draft
wants to merge 7 commits into
base: master
Choose a base branch
from

Conversation

Mr-Python-in-China
Copy link
Collaborator

No description provided.

@Mr-Python-in-China Mr-Python-in-China changed the title Mr-Python-in-China/issue165 Support testlib SPJ for grader Feb 17, 2025
@Mr-Python-in-China
Copy link
Collaborator Author

问题来了 test 怎么写

@weilycoder
Copy link
Contributor

在 Windows 下的一个 Bug:

总之重定向到 stdout 的行为没有成功,大概是因为 con 只是输出到控制台。

@Mr-Python-in-China
Copy link
Collaborator Author

在 Windows 下的一个 Bug:

总之重定向到 stdout 的行为没有成功,大概是因为 con 只是输出到控制台。

windows 怎么这么不牛 只能走临时文件了

@Mr-Python-in-China
Copy link
Collaborator Author

@weilycoder 没环境 你再试试

@weilycoder
Copy link
Contributor

我认为我有必要先描述我的测试方法,以便后续讨论:

  • 编译后为 a.exe
    #include <iostream>
    using namespace std;
    
    int main() {
      int a, b;
      cin >> a >> b;
      cout << a + b << endl;
      return 0;
    }
  • 编译后为 checker.exe
    #include "testlib.h"
    
    int main(int argc, char *argv[]) {
      registerTestlibCmd(argc, argv);
      int a = inf.readInt(), b = inf.readInt();
      int ret = ouf.readInt();
      if (a + b != ret)
        quitf(_wa, "Expected %d, found %d", a + b, ret);
      quitf(_ok, "Correct");
    }
  • data.in
    1 2
    
  • test.py
    # test.py
    from cyaron import *
    from cyaron.graders.testlib_checker import TestlibChecker
    
    tc = TestlibChecker("checker.exe")
    
    Compare.program("a.exe", input="data.in", std_program="a.exe", grader=tc)

@weilycoder
Copy link
Contributor

那么,现在有一个奇怪的行为:

with tempfile.NamedTemporaryFile('w') as inf, \
tempfile.NamedTemporaryFile('w') as outf, \
tempfile.NamedTemporaryFile('w') as ansf, \
tempfile.TemporaryDirectory() as checker_output_dir:

如果直接跑测试,报错(临时文件名可能不同):

Traceback (most recent call last):
  File "d:/Admin/Desktop/IDE/github/cyaron/test.py", line 10, in <module>
    Compare.program("a.exe", input="data.in", std_program="a.exe", grader=tc)
  File "d:\Admin\Desktop\IDE\github\cyaron\cyaron\compare.py", line 231, in program
    do(program)
  File "d:\Admin\Desktop\IDE\github\cyaron\cyaron\compare.py", line 225, in do
    cls.__compare_two(program_name, content, std, input_text, grader)
  File "d:\Admin\Desktop\IDE\github\cyaron\cyaron\compare.py", line 43, in __compare_two
    raise CompareMismatch(name, info)
cyaron.compare.CompareMismatch: In program: 'a.exe'. presentation-error Output file not found: "C:\Users\Admin\AppData\Local\Temp\tmp9k2bnhmf"

将 34 行加上 delete=False,报错信息变为:

Traceback (most recent call last):
  File "d:/Admin/Desktop/IDE/github/cyaron/test.py", line 10, in <module>
    Compare.program("a.exe", input="data.in", std_program="a.exe", grader=tc)
  File "d:\Admin\Desktop\IDE\github\cyaron\cyaron\compare.py", line 231, in program
    do(program)
  File "d:\Admin\Desktop\IDE\github\cyaron\cyaron\compare.py", line 225, in do
    cls.__compare_two(program_name, content, std, input_text, grader)
  File "d:\Admin\Desktop\IDE\github\cyaron\cyaron\compare.py", line 43, in __compare_two
    raise CompareMismatch(name, info)
cyaron.compare.CompareMismatch: In program: 'a.exe'. fail Answer file not found: "C:\Users\Admin\AppData\Local\Temp\tmpnrl2c9us"

继续在 35 行加上 delete=False,报错信息变为:

Traceback (most recent call last):
  File "d:/Admin/Desktop/IDE/github/cyaron/test.py", line 10, in <module>
    Compare.program("a.exe", input="data.in", std_program="a.exe", grader=tc)
  File "d:\Admin\Desktop\IDE\github\cyaron\cyaron\compare.py", line 231, in program
    do(program)
  File "d:\Admin\Desktop\IDE\github\cyaron\cyaron\compare.py", line 225, in do
    cls.__compare_two(program_name, content, std, input_text, grader)
  File "d:\Admin\Desktop\IDE\github\cyaron\cyaron\compare.py", line 43, in __compare_two
    raise CompareMismatch(name, info)
cyaron.compare.CompareMismatch: In program: 'a.exe'. fail Unexpected end of file - int32 expected (C:\Users\Admin\AppData\Local\Temp\tmpdmqem_79)

在 33 行加上 delete=False,不再报错。

@weilycoder
Copy link
Contributor

然后如果改成这样,行为看起来就很对:

with tempfile.TemporaryDirectory() as checker_output_dir, \
     open(path_join(checker_output_dir, 'input.txt'), 'w', newline='\n') as inf, \
     open(path_join(checker_output_dir, 'output.txt'), 'w', newline='\n') as outf, \
     open(path_join(checker_output_dir, 'answer.txt'), 'w', newline='\n') as ansf:
    ...

并且如果出现错误可能报错信息也更可读(临时文件见名知意)。

@Mr-Python-in-China
Copy link
Collaborator Author

所以是windows在关闭文件之前不会立即写入???

@weilycoder
Copy link
Contributor

weilycoder commented Feb 19, 2025

鬼知道啥行为?

我只是把 delete 设为 True 了,我没有 close

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants