| ... | ... | @@ -344,6 +344,82 @@ pub fn main() void { |
| 344 | 344 | </p> |
| 345 | 345 | {#see_also|Values|@import|Errors|Root Source File|Source Encoding#} |
| 346 | 346 | {#header_close#} |
| 347 | {#header_open|Zig Test#} |
| 348 | <p> |
| 349 | <code>zig test</code> is a tool that can be used to quickly build and run Zig code |
| 350 | to make sure behavior meets expectations. {#syntax#}@import("builtin").is_test{#endsyntax#} |
| 351 | is available for code to detect whether the current build is a test build. |
| 352 | </p> |
| 353 | {#code_begin|test|detect_test#} |
| 354 | const std = @import("std"); |
| 355 | const builtin = @import("builtin"); |
| 356 | const expect = std.testing.expect; |
| 357 | |
| 358 | test "builtin.is_test" { |
| 359 | try expect(builtin.is_test); |
| 360 | } |
| 361 | {#code_end#} |
| 362 | <p> |
| 363 | Zig has lazy top level declaration analysis, which means that if a function is not called, |
| 364 | or otherwise used, it is not analyzed. This means that there may be an undiscovered |
| 365 | compile error in a function because it is never called. |
| 366 | </p> |
| 367 | {#code_begin|test|unused_fn#} |
| 368 | fn unused() i32 { |
| 369 | return "wrong return type"; |
| 370 | } |
| 371 | test "unused function" { } |
| 372 | {#code_end#} |
| 373 | <p> |
| 374 | Note that, while in {#link|Debug#} and {#link|ReleaseSafe#} modes, {#link|unreachable#} emits a |
| 375 | call to {#link|@panic#}, in {#link|ReleaseFast#} and {#link|ReleaseSmall#} modes, it is really |
| 376 | undefined behavior. The implementation of {#syntax#}std.debug.assert{#endsyntax#} is as |
| 377 | simple as: |
| 378 | </p> |
| 379 | {#code_begin|syntax#} |
| 380 | pub fn assert(ok: bool) void { |
| 381 | if (!ok) unreachable; |
| 382 | } |
| 383 | {#code_end#} |
| 384 | <p> |
| 385 | This means that when testing in ReleaseFast or ReleaseSmall mode, {#syntax#}assert{#endsyntax#} |
| 386 | is not sufficient to check the result of a computation: |
| 387 | </p> |
| 388 | {#code_begin|syntax#} |
| 389 | const std = @import("std"); |
| 390 | const assert = std.debug.assert; |
| 391 | |
| 392 | test "assert in release fast mode" { |
| 393 | assert(false); |
| 394 | } |
| 395 | {#code_end#} |
| 396 | <p> |
| 397 | When compiling this test in {#link|ReleaseFast#} mode, it invokes unchecked |
| 398 | {#link|Undefined Behavior#}. Since that could do anything, this documentation |
| 399 | cannot show you the output. |
| 400 | </p> |
| 401 | <p> |
| 402 | Better practice for checking the output when testing is to use {#syntax#}std.testing.expect{#endsyntax#}: |
| 403 | </p> |
| 404 | {#code_begin|test_err|test "expect in release fast mode"... FAIL (TestUnexpectedResult)#} |
| 405 | {#code_release_fast#} |
| 406 | const std = @import("std"); |
| 407 | const expect = std.testing.expect; |
| 408 | |
| 409 | test "expect in release fast mode" { |
| 410 | try expect(false); |
| 411 | } |
| 412 | {#code_end#} |
| 413 | <p>See the rest of the {#syntax#}std.testing{#endsyntax#} namespace for more available functions.</p> |
| 414 | <p> |
| 415 | <code>zig test</code> has a few command line parameters which affect the compilation. See |
| 416 | <code>zig --help</code> for a full list. The most interesting one is <code>--test-filter [text]</code>. |
| 417 | This makes the test build only include tests whose name contains the supplied filter text. |
| 418 | Again, thanks to lazy analysis, this can allow you to narrow a build to only a few functions in |
| 419 | isolation. |
| 420 | </p> |
| 421 | {#header_close#} |
| 422 | |
| 347 | 423 | {#header_open|Comments#} |
| 348 | 424 | {#code_begin|test|comments#} |
| 349 | 425 | const expect = @import("std").testing.expect; |
| ... | ... | @@ -9725,82 +9801,6 @@ const separator = if (builtin.os.tag == builtin.Os.windows) '\\' else '/'; |
| 9725 | 9801 | <p>TODO: lazy analysis</p> |
| 9726 | 9802 | <p>TODO: using comptime { _ = @import() }</p> |
| 9727 | 9803 | {#header_close#} |
| 9728 | | {#header_open|Zig Test#} |
| 9729 | | <p> |
| 9730 | | <code>zig test</code> is a tool that can be used to quickly build and run Zig code |
| 9731 | | to make sure behavior meets expectations. {#syntax#}@import("builtin").is_test{#endsyntax#} |
| 9732 | | is available for code to detect whether the current build is a test build. |
| 9733 | | </p> |
| 9734 | | {#code_begin|test|detect_test#} |
| 9735 | | const std = @import("std"); |
| 9736 | | const builtin = @import("builtin"); |
| 9737 | | const expect = std.testing.expect; |
| 9738 | | |
| 9739 | | test "builtin.is_test" { |
| 9740 | | try expect(builtin.is_test); |
| 9741 | | } |
| 9742 | | {#code_end#} |
| 9743 | | <p> |
| 9744 | | Zig has lazy top level declaration analysis, which means that if a function is not called, |
| 9745 | | or otherwise used, it is not analyzed. This means that there may be an undiscovered |
| 9746 | | compile error in a function because it is never called. |
| 9747 | | </p> |
| 9748 | | {#code_begin|test|unused_fn#} |
| 9749 | | fn unused() i32 { |
| 9750 | | return "wrong return type"; |
| 9751 | | } |
| 9752 | | test "unused function" { } |
| 9753 | | {#code_end#} |
| 9754 | | <p> |
| 9755 | | Note that, while in {#link|Debug#} and {#link|ReleaseSafe#} modes, {#link|unreachable#} emits a |
| 9756 | | call to {#link|@panic#}, in {#link|ReleaseFast#} and {#link|ReleaseSmall#} modes, it is really |
| 9757 | | undefined behavior. The implementation of {#syntax#}std.debug.assert{#endsyntax#} is as |
| 9758 | | simple as: |
| 9759 | | </p> |
| 9760 | | {#code_begin|syntax#} |
| 9761 | | pub fn assert(ok: bool) void { |
| 9762 | | if (!ok) unreachable; |
| 9763 | | } |
| 9764 | | {#code_end#} |
| 9765 | | <p> |
| 9766 | | This means that when testing in ReleaseFast or ReleaseSmall mode, {#syntax#}assert{#endsyntax#} |
| 9767 | | is not sufficient to check the result of a computation: |
| 9768 | | </p> |
| 9769 | | {#code_begin|syntax#} |
| 9770 | | const std = @import("std"); |
| 9771 | | const assert = std.debug.assert; |
| 9772 | | |
| 9773 | | test "assert in release fast mode" { |
| 9774 | | assert(false); |
| 9775 | | } |
| 9776 | | {#code_end#} |
| 9777 | | <p> |
| 9778 | | When compiling this test in {#link|ReleaseFast#} mode, it invokes unchecked |
| 9779 | | {#link|Undefined Behavior#}. Since that could do anything, this documentation |
| 9780 | | cannot show you the output. |
| 9781 | | </p> |
| 9782 | | <p> |
| 9783 | | Better practice for checking the output when testing is to use {#syntax#}std.testing.expect{#endsyntax#}: |
| 9784 | | </p> |
| 9785 | | {#code_begin|test_err|test "expect in release fast mode"... FAIL (TestUnexpectedResult)#} |
| 9786 | | {#code_release_fast#} |
| 9787 | | const std = @import("std"); |
| 9788 | | const expect = std.testing.expect; |
| 9789 | | |
| 9790 | | test "expect in release fast mode" { |
| 9791 | | try expect(false); |
| 9792 | | } |
| 9793 | | {#code_end#} |
| 9794 | | <p>See the rest of the {#syntax#}std.testing{#endsyntax#} namespace for more available functions.</p> |
| 9795 | | <p> |
| 9796 | | <code>zig test</code> has a few command line parameters which affect the compilation. See |
| 9797 | | <code>zig --help</code> for a full list. The most interesting one is <code>--test-filter [text]</code>. |
| 9798 | | This makes the test build only include tests whose name contains the supplied filter text. |
| 9799 | | Again, thanks to lazy analysis, this can allow you to narrow a build to only a few functions in |
| 9800 | | isolation. |
| 9801 | | </p> |
| 9802 | | {#header_close#} |
| 9803 | | |
| 9804 | 9804 | {#header_open|Zig Build System#} |
| 9805 | 9805 | <p> |
| 9806 | 9806 | The Zig Build System provides a cross-platform, dependency-free way to declare |