diff --git a/doc/langref.html.in b/doc/langref.html.in index 0f156a3dd4..dae195e6b6 100644 --- a/doc/langref.html.in +++ b/doc/langref.html.in @@ -344,6 +344,82 @@ pub fn main() void {

{#see_also|Values|@import|Errors|Root Source File|Source Encoding#} {#header_close#} + {#header_open|Zig Test#} +

+ zig test is a tool that can be used to quickly build and run Zig code + to make sure behavior meets expectations. {#syntax#}@import("builtin").is_test{#endsyntax#} + is available for code to detect whether the current build is a test build. +

+ {#code_begin|test|detect_test#} +const std = @import("std"); +const builtin = @import("builtin"); +const expect = std.testing.expect; + +test "builtin.is_test" { + try expect(builtin.is_test); +} + {#code_end#} +

+ Zig has lazy top level declaration analysis, which means that if a function is not called, + or otherwise used, it is not analyzed. This means that there may be an undiscovered + compile error in a function because it is never called. +

+ {#code_begin|test|unused_fn#} +fn unused() i32 { + return "wrong return type"; +} +test "unused function" { } + {#code_end#} +

+ Note that, while in {#link|Debug#} and {#link|ReleaseSafe#} modes, {#link|unreachable#} emits a + call to {#link|@panic#}, in {#link|ReleaseFast#} and {#link|ReleaseSmall#} modes, it is really + undefined behavior. The implementation of {#syntax#}std.debug.assert{#endsyntax#} is as + simple as: +

+ {#code_begin|syntax#} +pub fn assert(ok: bool) void { + if (!ok) unreachable; +} + {#code_end#} +

+ This means that when testing in ReleaseFast or ReleaseSmall mode, {#syntax#}assert{#endsyntax#} + is not sufficient to check the result of a computation: +

+ {#code_begin|syntax#} +const std = @import("std"); +const assert = std.debug.assert; + +test "assert in release fast mode" { + assert(false); +} + {#code_end#} +

+ When compiling this test in {#link|ReleaseFast#} mode, it invokes unchecked + {#link|Undefined Behavior#}. Since that could do anything, this documentation + cannot show you the output. +

+

+ Better practice for checking the output when testing is to use {#syntax#}std.testing.expect{#endsyntax#}: +

+ {#code_begin|test_err|test "expect in release fast mode"... FAIL (TestUnexpectedResult)#} + {#code_release_fast#} +const std = @import("std"); +const expect = std.testing.expect; + +test "expect in release fast mode" { + try expect(false); +} + {#code_end#} +

See the rest of the {#syntax#}std.testing{#endsyntax#} namespace for more available functions.

+

+ zig test has a few command line parameters which affect the compilation. See + zig --help for a full list. The most interesting one is --test-filter [text]. + This makes the test build only include tests whose name contains the supplied filter text. + Again, thanks to lazy analysis, this can allow you to narrow a build to only a few functions in + isolation. +

+ {#header_close#} + {#header_open|Comments#} {#code_begin|test|comments#} const expect = @import("std").testing.expect; @@ -9725,82 +9801,6 @@ const separator = if (builtin.os.tag == builtin.Os.windows) '\\' else '/';

TODO: lazy analysis

TODO: using comptime { _ = @import() }

{#header_close#} - {#header_open|Zig Test#} -

- zig test is a tool that can be used to quickly build and run Zig code - to make sure behavior meets expectations. {#syntax#}@import("builtin").is_test{#endsyntax#} - is available for code to detect whether the current build is a test build. -

- {#code_begin|test|detect_test#} -const std = @import("std"); -const builtin = @import("builtin"); -const expect = std.testing.expect; - -test "builtin.is_test" { - try expect(builtin.is_test); -} - {#code_end#} -

- Zig has lazy top level declaration analysis, which means that if a function is not called, - or otherwise used, it is not analyzed. This means that there may be an undiscovered - compile error in a function because it is never called. -

- {#code_begin|test|unused_fn#} -fn unused() i32 { - return "wrong return type"; -} -test "unused function" { } - {#code_end#} -

- Note that, while in {#link|Debug#} and {#link|ReleaseSafe#} modes, {#link|unreachable#} emits a - call to {#link|@panic#}, in {#link|ReleaseFast#} and {#link|ReleaseSmall#} modes, it is really - undefined behavior. The implementation of {#syntax#}std.debug.assert{#endsyntax#} is as - simple as: -

- {#code_begin|syntax#} -pub fn assert(ok: bool) void { - if (!ok) unreachable; -} - {#code_end#} -

- This means that when testing in ReleaseFast or ReleaseSmall mode, {#syntax#}assert{#endsyntax#} - is not sufficient to check the result of a computation: -

- {#code_begin|syntax#} -const std = @import("std"); -const assert = std.debug.assert; - -test "assert in release fast mode" { - assert(false); -} - {#code_end#} -

- When compiling this test in {#link|ReleaseFast#} mode, it invokes unchecked - {#link|Undefined Behavior#}. Since that could do anything, this documentation - cannot show you the output. -

-

- Better practice for checking the output when testing is to use {#syntax#}std.testing.expect{#endsyntax#}: -

- {#code_begin|test_err|test "expect in release fast mode"... FAIL (TestUnexpectedResult)#} - {#code_release_fast#} -const std = @import("std"); -const expect = std.testing.expect; - -test "expect in release fast mode" { - try expect(false); -} - {#code_end#} -

See the rest of the {#syntax#}std.testing{#endsyntax#} namespace for more available functions.

-

- zig test has a few command line parameters which affect the compilation. See - zig --help for a full list. The most interesting one is --test-filter [text]. - This makes the test build only include tests whose name contains the supplied filter text. - Again, thanks to lazy analysis, this can allow you to narrow a build to only a few functions in - isolation. -

- {#header_close#} - {#header_open|Zig Build System#}

The Zig Build System provides a cross-platform, dependency-free way to declare