Pat*_*ity 1 unit-testing ada aunit
我正在尝试用简单的方法编写测试Ada.Text_IO.Put.为简单起见,这是一个我想测试的组合方法:
procedure Say_Something is
begin
Put("Something.");
end Say_Something;
Run Code Online (Sandbox Code Playgroud)
在我的AUnit测试中,我有:
procedure Test_Put (T : in out Test) is
pragma Unreferenced (T);
use Ada.Text_IO;
Stdout : constant File_Type := Standard_Output;
Put_File_Name : constant String := "say_something_test.txt";
Put_File : File_Type;
Expected : constant String := "Something.";
begin
-- Create the output file and redirect output
Create (Put_File, Append_File, Put_File_Name);
Set_Output (Put_File);
Say_Something;
-- Redirect output to stdout and close the file
Set_Output (Stdout);
Close (Put_File);
-- Read file
declare
File_Size : constant Natural :=
Natural (Ada.Directories.Size (Put_File_Name));
Actual : String (1 .. File_Size);
begin
Actual := Read_File (Put_File_Name, File_Size);
Ada.Directories.Delete_File (Put_File_Name);
Assert (Expected = Actual,
"Expected " & '"' & Expected & '"' & ", " &
"Got " & '"' & Actual & '"');
end;
end Test_Put;
function Read_File (File_Name : String; File_Size : Natural)
return String is
subtype File_String is String (1 .. File_Size);
package File_String_IO is new Ada.Direct_IO (File_String);
File : File_String_IO.File_Type;
Contents : File_String;
begin
File_String_IO.Open (File, File_String_IO.In_File, File_Name);
File_String_IO.Read (File, Contents);
File_String_IO.Close (File);
return Contents;
end Read_File;
Run Code Online (Sandbox Code Playgroud)
不幸的是,结果是:
FAIL Test Vectors.Put
Expected "Something.", Got "Something.
"
Run Code Online (Sandbox Code Playgroud)
似乎Ada自动在文件末尾添加换行符.我意识到我可以添加一个(CR)LF到我期望的字符串,如下所示:
Expected : constant String := "Something.";
& Ada.Characters.Latin_1.CR
& Ada.Characters.Latin_1.LF;
Run Code Online (Sandbox Code Playgroud)
但是a)改变我期望的字符串感觉不对,并且b)这将在Windows机器上运行,但在Unix/Linux/Mac上我将不得不放弃"CR".换句话说,我的测试运行的成功与平台有关,而我的代码则不然,这很糟糕.
所以我的问题是:如何在不附加换行符的情况下写入文件?关于如何测试输出的其他建议也非常受欢迎.
我已经看到了这个相关的问题,但除了我可能会尝试Append_File而Out_File不是解决我的问题的模式之外,我无法从中推断出任何有用的信息.
对不起我之前的回答,我错过了你正在阅读的文件是你之前在程序中创建的文件.
在Ada.Text_IO,RM(A.10(7-8))说"文件的结尾由行终止符的组合标记,紧接着是页面终止符然后是文件终止符",以及"终结符的实际性质"语言没有定义,因此取决于实现"......"它们不一定被实现为字符或字符序列".因此,当您创建时say_something_test.txt,它将始终以"行终止符"结束,尽管这并不一定意味着它将以LF结束.这是依赖于实现的.您唯一能保证的是,如果您使用Ada.Text_IO创建文件,如果您重新阅读它,它将正常工作Ada.Text_IO.但是如果你想要这个级别的控制写入文件的实际字节,那么Ada.Text_IO真的不合适; 你最好不要再使用了Ada.Stream_IO.
CR和/或LF是否写入文件的末尾是依赖于实现的.看起来GNAT确实将LF(也许是CR)添加到最后,并且它没有提供Form关闭此行为的方法(例如参数).至少我没有在手册中看到一个.
如果您真的决定使用它Ada.Text_IO来写入say_something_test.txt并Ada.Direct_IO重新读取,那么您需要知道该文件可能包含也可能不包含CR/LF,并且输入例程应该检查这些字符并将其剥离,以便字符串可以与期望值进行比较.