UnityAssertionsReference.md 31.1 KB
Newer Older
T
toby 已提交
1
# Unity Assertions Reference
2

T
toby 已提交
3
## Background and Overview
4

T
toby 已提交
5
### Super Condensed Version
6 7

- An assertion establishes truth (i.e. boolean True) for a single condition.
T
toby 已提交
8
Upon boolean False, an assertion stops execution and reports the failure.
9
- Unity is mainly a rich collection of assertions and the support to gather up
T
toby 已提交
10
and easily execute those assertions.
11
- The structure of Unity allows you to easily separate test assertions from
T
toby 已提交
12 13
source code in, well, test code.
- Unity's assertions:
14
- Come in many, many flavors to handle different C types and assertion cases.
T
toby 已提交
15
- Use context to provide detailed and helpful failure messages.
16
- Document types, expected values, and basic behavior in your source code for
T
toby 已提交
17 18
free.

19

T
toby 已提交
20
### Unity Is Several Things But Mainly It's Assertions
21 22 23 24

One way to think of Unity is simply as a rich collection of assertions you can
use to establish whether your source code behaves the way you think it does.
Unity provides a framework to easily organize and execute those assertions in
T
toby 已提交
25 26
test code separate from your source code.

27

T
toby 已提交
28
### What's an Assertion?
29 30 31 32 33 34 35

At their core, assertions are an establishment of truth - boolean truth. Was this
thing equal to that thing? Does that code doohickey have such-and-such property
or not? You get the idea. Assertions are executable code (to appreciate the big
picture on this read up on the difference between
[link:Dynamic Verification and Static Analysis]). A failing assertion stops
execution and reports an error through some appropriate I/O channel (e.g.
T
toby 已提交
36 37
stdout, GUI, file, blinky light).

38 39 40 41 42 43 44
Fundamentally, for dynamic verification all you need is a single assertion
mechanism. In fact, that's what the [assert() macro in C's standard library](http://en.wikipedia.org/en/wiki/Assert.h)
is for. So why not just use it? Well, we can do far better in the reporting
department. C's `assert()` is pretty dumb as-is and is particularly poor for
handling common data types like arrays, structs, etc. And, without some other
support, it's far too tempting to litter source code with C's `assert()`'s. It's
generally much cleaner, manageable, and more useful to separate test and source
T
toby 已提交
45 46
code in the way Unity facilitates.

47

T
toby 已提交
48
### Unity's Assertions: Helpful Messages _and_ Free Source Code Documentation
49 50 51 52

Asserting a simple truth condition is valuable, but using the context of the
assertion is even more valuable. For instance, if you know you're comparing bit
flags and not just integers, then why not use that context to give explicit,
T
toby 已提交
53 54
readable, bit-level feedback when an assertion fails?

55 56 57 58 59 60
That's what Unity's collection of assertions do - capture context to give you
helpful, meaningful assertion failure messages. In fact, the assertions
themselves also serve as executable documentation about types and values in your
source code. So long as your tests remain current with your source and all those
tests pass, you have a detailed, up-to-date view of the intent and mechanisms in
your source code. And due to a wondrous mystery, well-tested code usually tends
T
toby 已提交
61 62
to be well designed code.

63

T
toby 已提交
64
## Assertion Conventions and Configurations
65

T
toby 已提交
66
### Naming and Parameter Conventions
67

T
toby 已提交
68
The convention of assertion parameters generally follows this order:
69

T
toby 已提交
70 71
    TEST_ASSERT_X( {modifiers}, {expected}, actual, {size/count} )

72
The very simplest assertion possible uses only a single "actual" parameter (e.g.
T
toby 已提交
73 74
a simple null check).

75
"Actual" is the value being tested and unlike the other parameters in an
T
toby 已提交
76 77
assertion construction is the only parameter present in all assertion variants.
"Modifiers" are masks, ranges, bit flag specifiers, floating point deltas.
78 79
"Expected" is your expected value (duh) to compare to an "actual" value; it's
marked as an optional parameter because some assertions only need a single
T
toby 已提交
80 81 82
"actual" parameter (e.g. null check).
"Size/count" refers to string lengths, number of array elements, etc.

D
Deryew 已提交
83
Many of Unity's assertions are clear duplications in that the same data type
84 85
is handled by several assertions. The differences among these are in how failure
messages are presented. For instance, a `_HEX` variant of an assertion prints
T
toby 已提交
86 87
the expected and actual values of that assertion formatted as hexadecimal.

88

T
toby 已提交
89
#### TEST_ASSERT_X_MESSAGE Variants
90 91 92

_All_ assertions are complemented with a variant that includes a simple string
message as a final parameter. The string you specify is appended to an assertion
T
toby 已提交
93 94
failure message in Unity output.

95 96
For brevity, the assertion variants with a message parameter are not listed
below. Just tack on `_MESSAGE` as the final component to any assertion name in
T
toby 已提交
97 98 99 100 101
the reference list below and add a string as the final parameter.

_Example:_

    TEST_ASSERT_X( {modifiers}, {expected}, actual, {size/count} )
102

T
toby 已提交
103 104 105 106
becomes messageified like thus...

    TEST_ASSERT_X_MESSAGE( {modifiers}, {expected}, actual, {size/count}, message )

107
Notes:
108
- The `_MESSAGE` variants intentionally do not support `printf` style formatting
109 110 111
  since many embedded projects don't support or avoid `printf` for various reasons.
  It is possible to use `sprintf` before the assertion to assemble a complex fail
  message, if necessary.
112 113
- If you want to output a counter value within an assertion fail message (e.g. from
  a loop) , building up an array of results and then using one of the `_ARRAY`
114 115
  assertions (see below) might be a handy alternative to `sprintf`.

116

T
toby 已提交
117
#### TEST_ASSERT_X_ARRAY Variants
118 119 120 121 122

Unity provides a collection of assertions for arrays containing a variety of
types. These are documented in the Array section below. These are almost on par
with the `_MESSAGE`variants of Unity's Asserts in that for pretty much any Unity
type assertion you can tack on `_ARRAY` and run assertions on an entire block of
T
toby 已提交
123 124 125 126 127
memory.

    TEST_ASSERT_EQUAL_TYPEX_ARRAY( expected, actual, {size/count} )

"Expected" is an array itself.
128
"Size/count" is one or two parameters necessary to establish the number of array
T
toby 已提交
129 130
elements and perhaps the length of elements within the array.

131 132 133
Notes:
- The `_MESSAGE` variant convention still applies here to array assertions. The
`_MESSAGE` variants of the `_ARRAY` assertions have names ending with
T
toby 已提交
134
`_ARRAY_MESSAGE`.
135
- Assertions for handling arrays of floating point values are grouped with float
T
toby 已提交
136 137
and double assertions (see immediately following section).

138

T
toby 已提交
139 140
### TEST_ASSERT_EACH_EQUAL_X Variants

M
Mark VanderVoord 已提交
141 142 143
Unity provides a collection of assertions for arrays containing a variety of
types which can be compared to a single value as well. These are documented in
the Each Equal section below. these are almost on par with the `_MESSAGE`
T
toby 已提交
144 145 146 147 148 149 150
variants of Unity's Asserts in that for pretty much any Unity type assertion you
can inject _EACH_EQUAL and run assertions on an entire block of memory.

    TEST_ASSERT_EACH_EQUAL_TYPEX( expected, actual, {size/count} )

"Expected" is a single value to compare to.
"Actual" is an array where each element will be compared to the expected value.
M
Mark VanderVoord 已提交
151
"Size/count" is one of two parameters necessary to establish the number of array
T
toby 已提交
152 153 154 155
elements and perhaps the length of elements within the array.

Notes:
- The `_MESSAGE` variant convention still applies here to Each Equal assertions.
M
Mark VanderVoord 已提交
156
- Assertions for handling Each Equal of floating point values are grouped with
T
toby 已提交
157 158 159
float and double assertions (see immediately following section).


T
toby 已提交
160
### Configuration
161

T
toby 已提交
162
#### Floating Point Support Is Optional
163 164 165 166 167

Support for floating point types is configurable. That is, by defining the
appropriate preprocessor symbols, floats and doubles can be individually enabled
or disabled in Unity code. This is useful for embedded targets with no floating
point math support (i.e. Unity compiles free of errors for fixed point only
T
toby 已提交
168 169
platforms). See Unity documentation for specifics.

170

T
toby 已提交
171
#### Maximum Data Type Width Is Configurable
172 173 174 175

Not all targets support 64 bit wide types or even 32 bit wide types. Define the
appropriate preprocessor symbols and Unity will omit all operations from
compilation that exceed the maximum width of your target. See Unity
T
toby 已提交
176 177
documentation for specifics.

178

T
toby 已提交
179
## The Assertions in All Their Blessed Glory
180

181
### Basic Fail, Pass and Ignore
T
toby 已提交
182 183

##### `TEST_FAIL()`
184

185 186
##### `TEST_FAIL_MESSAGE("message")`

187 188
This fella is most often used in special conditions where your test code is
performing logic beyond a simple assertion. That is, in practice, `TEST_FAIL()`
T
toby 已提交
189 190 191
will always be found inside a conditional code block.

_Examples:_
192
- Executing a state machine multiple times that increments a counter your test
T
toby 已提交
193
code then verifies as a final step.
194
- Triggering an exception and verifying it (as in Try / Catch / Throw - see the
T
toby 已提交
195 196
[CException](https://github.com/ThrowTheSwitch/CException) project).

197 198 199 200 201 202 203 204 205
##### `TEST_PASS()`

##### `TEST_PASS_MESSAGE("message")`

This will abort the remainder of the test, but count the test as a pass. Under
normal circumstances, it is not necessary to include this macro in your tests...
a lack of failure will automatically be counted as a `PASS`. It is occasionally
useful for tests with `#ifdef`s and such.

T
toby 已提交
206
##### `TEST_IGNORE()`
207

208 209
##### `TEST_IGNORE_MESSAGE("message")`

210 211 212
Marks a test case (i.e. function meant to contain test assertions) as ignored.
Usually this is employed as a breadcrumb to come back and implement a test case.
An ignored test case has effects if other assertions are in the enclosing test
T
toby 已提交
213 214
case (see Unity documentation for more).

215 216 217 218 219 220
##### `TEST_MESSAGE(message)`

This can be useful for outputting `INFO` messages into the Unity output stream
without actually ending the test. Like pass and fail messages, it will be output
with the filename and line number.

T
toby 已提交
221
### Boolean
222

T
toby 已提交
223
##### `TEST_ASSERT (condition)`
224

T
toby 已提交
225
##### `TEST_ASSERT_TRUE (condition)`
226

T
toby 已提交
227
##### `TEST_ASSERT_FALSE (condition)`
228

T
toby 已提交
229
##### `TEST_ASSERT_UNLESS (condition)`
230 231 232

A simple wording variation on `TEST_ASSERT_FALSE`.The semantics of
`TEST_ASSERT_UNLESS` aid readability in certain test constructions or
T
toby 已提交
233 234 235
conditional statements.

##### `TEST_ASSERT_NULL (pointer)`
236

T
toby 已提交
237 238 239 240
##### `TEST_ASSERT_NOT_NULL (pointer)`


### Signed and Unsigned Integers (of all sizes)
241 242 243 244 245 246

Large integer sizes can be disabled for build targets that do not support them.
For example, if your target only supports up to 16 bit types, by defining the
appropriate symbols Unity can be configured to omit 32 and 64 bit operations
that would break compilation (see Unity documentation for more). Refer to
Advanced Asserting later in this document for advice on dealing with other word
T
toby 已提交
247 248 249
sizes.

##### `TEST_ASSERT_EQUAL_INT (expected, actual)`
250

T
toby 已提交
251
##### `TEST_ASSERT_EQUAL_INT8 (expected, actual)`
252

T
toby 已提交
253
##### `TEST_ASSERT_EQUAL_INT16 (expected, actual)`
254

T
toby 已提交
255
##### `TEST_ASSERT_EQUAL_INT32 (expected, actual)`
256

T
toby 已提交
257
##### `TEST_ASSERT_EQUAL_INT64 (expected, actual)`
258

T
toby 已提交
259
##### `TEST_ASSERT_EQUAL_UINT (expected, actual)`
260

T
toby 已提交
261
##### `TEST_ASSERT_EQUAL_UINT8 (expected, actual)`
262

T
toby 已提交
263
##### `TEST_ASSERT_EQUAL_UINT16 (expected, actual)`
264

T
toby 已提交
265
##### `TEST_ASSERT_EQUAL_UINT32 (expected, actual)`
266

T
toby 已提交
267 268
##### `TEST_ASSERT_EQUAL_UINT64 (expected, actual)`

269

T
toby 已提交
270
### Unsigned Integers (of all sizes) in Hexadecimal
271 272 273

All `_HEX` assertions are identical in function to unsigned integer assertions
but produce failure messages with the `expected` and `actual` values formatted
T
toby 已提交
274 275 276
in hexadecimal. Unity output is big endian.

##### `TEST_ASSERT_EQUAL_HEX (expected, actual)`
277

T
toby 已提交
278
##### `TEST_ASSERT_EQUAL_HEX8 (expected, actual)`
279

T
toby 已提交
280
##### `TEST_ASSERT_EQUAL_HEX16 (expected, actual)`
281

T
toby 已提交
282
##### `TEST_ASSERT_EQUAL_HEX32 (expected, actual)`
283

T
toby 已提交
284 285
##### `TEST_ASSERT_EQUAL_HEX64 (expected, actual)`

286

287 288 289 290 291 292 293 294 295
### Characters

While you can use the 8-bit integer assertions to compare `char`, another option is
to use this specialized assertion which will show printable characters as printables,
otherwise showing the HEX escape code for the characters.

##### `TEST_ASSERT_EQUAL_CHAR (expected, actual)`


T
toby 已提交
296
### Masked and Bit-level Assertions
297 298

Masked and bit-level assertions produce output formatted in hexadecimal. Unity
T
toby 已提交
299
output is big endian.
300 301


T
toby 已提交
302
##### `TEST_ASSERT_BITS (mask, expected, actual)`
303 304 305

Only compares the masked (i.e. high) bits of `expected` and `actual` parameters.

T
toby 已提交
306 307

##### `TEST_ASSERT_BITS_HIGH (mask, actual)`
308

T
toby 已提交
309 310
Asserts the masked bits of the `actual` parameter are high.

311

T
toby 已提交
312
##### `TEST_ASSERT_BITS_LOW (mask, actual)`
313

T
toby 已提交
314
Asserts the masked bits of the `actual` parameter are low.
315 316


T
toby 已提交
317
##### `TEST_ASSERT_BIT_HIGH (bit, actual)`
318

T
toby 已提交
319
Asserts the specified bit of the `actual` parameter is high.
320 321


T
toby 已提交
322
##### `TEST_ASSERT_BIT_LOW (bit, actual)`
323

T
toby 已提交
324 325
Asserts the specified bit of the `actual` parameter is low.

326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355
### Integer Less Than / Greater Than

These assertions verify that the `actual` parameter is less than or greater
than `threshold` (exclusive). For example, if the threshold value is 0 for the
greater than assertion will fail if it is 0 or less.

##### `TEST_ASSERT_GREATER_THAN (threshold, actual)`

##### `TEST_ASSERT_GREATER_THAN_INT (threshold, actual)`

##### `TEST_ASSERT_GREATER_THAN_INT8 (threshold, actual)`

##### `TEST_ASSERT_GREATER_THAN_INT16 (threshold, actual)`

##### `TEST_ASSERT_GREATER_THAN_INT32 (threshold, actual)`

##### `TEST_ASSERT_GREATER_THAN_UINT (threshold, actual)`

##### `TEST_ASSERT_GREATER_THAN_UINT8 (threshold, actual)`

##### `TEST_ASSERT_GREATER_THAN_UINT16 (threshold, actual)`

##### `TEST_ASSERT_GREATER_THAN_UINT32 (threshold, actual)`

##### `TEST_ASSERT_GREATER_THAN_HEX8 (threshold, actual)`

##### `TEST_ASSERT_GREATER_THAN_HEX16 (threshold, actual)`

##### `TEST_ASSERT_GREATER_THAN_HEX32 (threshold, actual)`

356 357
##### `TEST_ASSERT_GREATER_THAN_CHAR (threshold, actual)`

358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381
##### `TEST_ASSERT_LESS_THAN (threshold, actual)`

##### `TEST_ASSERT_LESS_THAN_INT (threshold, actual)`

##### `TEST_ASSERT_LESS_THAN_INT8 (threshold, actual)`

##### `TEST_ASSERT_LESS_THAN_INT16 (threshold, actual)`

##### `TEST_ASSERT_LESS_THAN_INT32 (threshold, actual)`

##### `TEST_ASSERT_LESS_THAN_UINT (threshold, actual)`

##### `TEST_ASSERT_LESS_THAN_UINT8 (threshold, actual)`

##### `TEST_ASSERT_LESS_THAN_UINT16 (threshold, actual)`

##### `TEST_ASSERT_LESS_THAN_UINT32 (threshold, actual)`

##### `TEST_ASSERT_LESS_THAN_HEX8 (threshold, actual)`

##### `TEST_ASSERT_LESS_THAN_HEX16 (threshold, actual)`

##### `TEST_ASSERT_LESS_THAN_HEX32 (threshold, actual)`

382 383
##### `TEST_ASSERT_LESS_THAN_CHAR (threshold, actual)`

384

T
toby 已提交
385
### Integer Ranges (of all sizes)
386 387 388 389

These assertions verify that the `expected` parameter is within +/- `delta`
(inclusive) of the `actual` parameter. For example, if the expected value is 10
and the delta is 3 then the assertion will fail for any value outside the range
T
toby 已提交
390 391 392
of 7 - 13.

##### `TEST_ASSERT_INT_WITHIN (delta, expected, actual)`
393

T
toby 已提交
394
##### `TEST_ASSERT_INT8_WITHIN (delta, expected, actual)`
395

T
toby 已提交
396
##### `TEST_ASSERT_INT16_WITHIN (delta, expected, actual)`
397

T
toby 已提交
398
##### `TEST_ASSERT_INT32_WITHIN (delta, expected, actual)`
399

T
toby 已提交
400
##### `TEST_ASSERT_INT64_WITHIN (delta, expected, actual)`
401

T
toby 已提交
402
##### `TEST_ASSERT_UINT_WITHIN (delta, expected, actual)`
403

T
toby 已提交
404
##### `TEST_ASSERT_UINT8_WITHIN (delta, expected, actual)`
405

T
toby 已提交
406
##### `TEST_ASSERT_UINT16_WITHIN (delta, expected, actual)`
407

T
toby 已提交
408
##### `TEST_ASSERT_UINT32_WITHIN (delta, expected, actual)`
409

T
toby 已提交
410
##### `TEST_ASSERT_UINT64_WITHIN (delta, expected, actual)`
411

T
toby 已提交
412
##### `TEST_ASSERT_HEX_WITHIN (delta, expected, actual)`
413

T
toby 已提交
414
##### `TEST_ASSERT_HEX8_WITHIN (delta, expected, actual)`
415

T
toby 已提交
416
##### `TEST_ASSERT_HEX16_WITHIN (delta, expected, actual)`
417

T
toby 已提交
418
##### `TEST_ASSERT_HEX32_WITHIN (delta, expected, actual)`
419

T
toby 已提交
420 421
##### `TEST_ASSERT_HEX64_WITHIN (delta, expected, actual)`

422 423
##### `TEST_ASSERT_CHAR_WITHIN (delta, expected, actual)`

T
toby 已提交
424
### Structs and Strings
425

T
toby 已提交
426
##### `TEST_ASSERT_EQUAL_PTR (expected, actual)`
427

T
toby 已提交
428 429
Asserts that the pointers point to the same memory location.

430

T
toby 已提交
431
##### `TEST_ASSERT_EQUAL_STRING (expected, actual)`
432 433 434 435

Asserts that the null terminated (`'\0'`)strings are identical. If strings are
of different lengths or any portion of the strings before their terminators
differ, the assertion fails. Two NULL strings (i.e. zero length) are considered
T
toby 已提交
436 437
equivalent.

438

T
toby 已提交
439
##### `TEST_ASSERT_EQUAL_MEMORY (expected, actual, len)`
440 441 442

Asserts that the contents of the memory specified by the `expected` and `actual`
pointers is identical. The size of the memory blocks in bytes is specified by
T
toby 已提交
443 444
the `len` parameter.

445

T
toby 已提交
446
### Arrays
447 448

`expected` and `actual` parameters are both arrays. `num_elements` specifies the
T
toby 已提交
449 450
number of elements in the arrays to compare.

451
`_HEX` assertions produce failure messages with expected and actual array
T
toby 已提交
452 453
contents formatted in hexadecimal.

454
For array of strings comparison behavior, see comments for
T
toby 已提交
455 456
`TEST_ASSERT_EQUAL_STRING` in the preceding section.

457
Assertions fail upon the first element in the compared arrays found not to
T
toby 已提交
458 459 460
match. Failure messages specify the array index of the failed comparison.

##### `TEST_ASSERT_EQUAL_INT_ARRAY (expected, actual, num_elements)`
461

T
toby 已提交
462
##### `TEST_ASSERT_EQUAL_INT8_ARRAY (expected, actual, num_elements)`
463

T
toby 已提交
464
##### `TEST_ASSERT_EQUAL_INT16_ARRAY (expected, actual, num_elements)`
465

T
toby 已提交
466
##### `TEST_ASSERT_EQUAL_INT32_ARRAY (expected, actual, num_elements)`
467

T
toby 已提交
468
##### `TEST_ASSERT_EQUAL_INT64_ARRAY (expected, actual, num_elements)`
469

T
toby 已提交
470
##### `TEST_ASSERT_EQUAL_UINT_ARRAY (expected, actual, num_elements)`
471

T
toby 已提交
472
##### `TEST_ASSERT_EQUAL_UINT8_ARRAY (expected, actual, num_elements)`
473

T
toby 已提交
474
##### `TEST_ASSERT_EQUAL_UINT16_ARRAY (expected, actual, num_elements)`
475

T
toby 已提交
476
##### `TEST_ASSERT_EQUAL_UINT32_ARRAY (expected, actual, num_elements)`
477

T
toby 已提交
478
##### `TEST_ASSERT_EQUAL_UINT64_ARRAY (expected, actual, num_elements)`
479

T
toby 已提交
480
##### `TEST_ASSERT_EQUAL_HEX_ARRAY (expected, actual, num_elements)`
481

T
toby 已提交
482
##### `TEST_ASSERT_EQUAL_HEX8_ARRAY (expected, actual, num_elements)`
483

T
toby 已提交
484
##### `TEST_ASSERT_EQUAL_HEX16_ARRAY (expected, actual, num_elements)`
485

T
toby 已提交
486
##### `TEST_ASSERT_EQUAL_HEX32_ARRAY (expected, actual, num_elements)`
487

T
toby 已提交
488
##### `TEST_ASSERT_EQUAL_HEX64_ARRAY (expected, actual, num_elements)`
489

490 491
##### `TEST_ASSERT_EQUAL_CHAR_ARRAY (expected, actual, num_elements)`

T
toby 已提交
492
##### `TEST_ASSERT_EQUAL_PTR_ARRAY (expected, actual, num_elements)`
493

T
toby 已提交
494
##### `TEST_ASSERT_EQUAL_STRING_ARRAY (expected, actual, num_elements)`
495

T
toby 已提交
496
##### `TEST_ASSERT_EQUAL_MEMORY_ARRAY (expected, actual, len, num_elements)`
497

T
toby 已提交
498 499
`len` is the memory in bytes to be compared at each array element.

D
Dom Postorivo 已提交
500 501 502 503 504 505 506
### Integer Array Ranges (of all sizes)

These assertions verify that the `expected` array parameter is within +/- `delta`
(inclusive) of the `actual` array parameter. For example, if the expected value is
\[10, 12\] and the delta is 3 then the assertion will fail for any value
outside the range of \[7 - 13, 9 - 15\].

507
##### `TEST_ASSERT_INT_ARRAY_WITHIN (delta, expected, actual, num_elements)`
D
Dom Postorivo 已提交
508

509
##### `TEST_ASSERT_INT8_ARRAY_WITHIN (delta, expected, actual, num_elements)`
D
Dom Postorivo 已提交
510

511
##### `TEST_ASSERT_INT16_ARRAY_WITHIN (delta, expected, actual, num_elements)`
D
Dom Postorivo 已提交
512

513
##### `TEST_ASSERT_INT32_ARRAY_WITHIN (delta, expected, actual, num_elements)`
D
Dom Postorivo 已提交
514

515
##### `TEST_ASSERT_INT64_ARRAY_WITHIN (delta, expected, actual, num_elements)`
D
Dom Postorivo 已提交
516

517
##### `TEST_ASSERT_UINT_ARRAY_WITHIN (delta, expected, actual, num_elements)`
D
Dom Postorivo 已提交
518

519
##### `TEST_ASSERT_UINT8_ARRAY_WITHIN (delta, expected, actual, num_elements)`
D
Dom Postorivo 已提交
520

521
##### `TEST_ASSERT_UINT16_ARRAY_WITHIN (delta, expected, actual, num_elements)`
D
Dom Postorivo 已提交
522

523
##### `TEST_ASSERT_UINT32_ARRAY_WITHIN (delta, expected, actual, num_elements)`
D
Dom Postorivo 已提交
524

525
##### `TEST_ASSERT_UINT64_ARRAY_WITHIN (delta, expected, actual, num_elements)`
D
Dom Postorivo 已提交
526

527
##### `TEST_ASSERT_HEX_ARRAY_WITHIN (delta, expected, actual, num_elements)`
D
Dom Postorivo 已提交
528

529
##### `TEST_ASSERT_HEX8_ARRAY_WITHIN (delta, expected, actual, num_elements)`
D
Dom Postorivo 已提交
530

531
##### `TEST_ASSERT_HEX16_ARRAY_WITHIN (delta, expected, actual, num_elements)`
D
Dom Postorivo 已提交
532

533
##### `TEST_ASSERT_HEX32_ARRAY_WITHIN (delta, expected, actual, num_elements)`
D
Dom Postorivo 已提交
534

535
##### `TEST_ASSERT_HEX64_ARRAY_WITHIN (delta, expected, actual, num_elements)`
536

537 538
##### `TEST_ASSERT_CHAR_ARRAY_WITHIN (delta, expected, actual, num_elements)`

T
toby 已提交
539 540 541 542 543
### Each Equal (Arrays to Single Value)

`expected` are single values and `actual` are arrays. `num_elements` specifies
the number of elements in the arrays to compare.

M
Mark VanderVoord 已提交
544
`_HEX` assertions produce failure messages with expected and actual array
T
toby 已提交
545 546
contents formatted in hexadecimal.

M
Mark VanderVoord 已提交
547
Assertions fail upon the first element in the compared arrays found not to
T
toby 已提交
548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579
match. Failure messages specify the array index of the failed comparison.

#### `TEST_ASSERT_EACH_EQUAL_INT (expected, actual, num_elements)`

#### `TEST_ASSERT_EACH_EQUAL_INT8 (expected, actual, num_elements)`

#### `TEST_ASSERT_EACH_EQUAL_INT16 (expected, actual, num_elements)`

#### `TEST_ASSERT_EACH_EQUAL_INT32 (expected, actual, num_elements)`

#### `TEST_ASSERT_EACH_EQUAL_INT64 (expected, actual, num_elements)`

#### `TEST_ASSERT_EACH_EQUAL_UINT (expected, actual, num_elements)`

#### `TEST_ASSERT_EACH_EQUAL_UINT8 (expected, actual, num_elements)`

#### `TEST_ASSERT_EACH_EQUAL_UINT16 (expected, actual, num_elements)`

#### `TEST_ASSERT_EACH_EQUAL_UINT32 (expected, actual, num_elements)`

#### `TEST_ASSERT_EACH_EQUAL_UINT64 (expected, actual, num_elements)`

#### `TEST_ASSERT_EACH_EQUAL_HEX (expected, actual, num_elements)`

#### `TEST_ASSERT_EACH_EQUAL_HEX8 (expected, actual, num_elements)`

#### `TEST_ASSERT_EACH_EQUAL_HEX16 (expected, actual, num_elements)`

#### `TEST_ASSERT_EACH_EQUAL_HEX32 (expected, actual, num_elements)`

#### `TEST_ASSERT_EACH_EQUAL_HEX64 (expected, actual, num_elements)`

580 581
#### `TEST_ASSERT_EACH_EQUAL_CHAR (expected, actual, num_elements)`

T
toby 已提交
582 583 584 585 586 587 588 589 590
#### `TEST_ASSERT_EACH_EQUAL_PTR (expected, actual, num_elements)`

#### `TEST_ASSERT_EACH_EQUAL_STRING (expected, actual, num_elements)`

#### `TEST_ASSERT_EACH_EQUAL_MEMORY (expected, actual, len, num_elements)`

`len` is the memory in bytes to be compared at each array element.


T
toby 已提交
591
### Floating Point (If enabled)
592

T
toby 已提交
593
##### `TEST_ASSERT_FLOAT_WITHIN (delta, expected, actual)`
594 595 596

Asserts that the `actual` value is within +/- `delta` of the `expected` value.
The nature of floating point representation is such that exact evaluations of
T
toby 已提交
597 598
equality are not guaranteed.

599

T
toby 已提交
600
##### `TEST_ASSERT_EQUAL_FLOAT (expected, actual)`
601 602 603 604 605

Asserts that the ?actual?value is "close enough to be considered equal" to the
`expected` value. If you are curious about the details, refer to the Advanced
Asserting section for more details on this. Omitting a user-specified delta in a
floating point assertion is both a shorthand convenience and a requirement of
T
toby 已提交
606 607
code generation conventions for CMock.

608

T
toby 已提交
609
##### `TEST_ASSERT_EQUAL_FLOAT_ARRAY (expected, actual, num_elements)`
610 611 612 613

See Array assertion section for details. Note that individual array element
float comparisons are executed using T?EST_ASSERT_EQUAL_FLOAT?.That is, user
specified delta comparison values requires a custom-implemented floating point
T
toby 已提交
614 615
array assertion.

616

T
toby 已提交
617
##### `TEST_ASSERT_FLOAT_IS_INF (actual)`
618 619

Asserts that `actual` parameter is equivalent to positive infinity floating
T
toby 已提交
620 621
point representation.

622

T
toby 已提交
623
##### `TEST_ASSERT_FLOAT_IS_NEG_INF (actual)`
624 625

Asserts that `actual` parameter is equivalent to negative infinity floating
T
toby 已提交
626 627
point representation.

628

T
toby 已提交
629
##### `TEST_ASSERT_FLOAT_IS_NAN (actual)`
630

T
toby 已提交
631 632
Asserts that `actual` parameter is a Not A Number floating point representation.

633

T
toby 已提交
634
##### `TEST_ASSERT_FLOAT_IS_DETERMINATE (actual)`
635 636 637

Asserts that ?actual?parameter is a floating point representation usable for
mathematical operations. That is, the `actual` parameter is neither positive
T
toby 已提交
638 639
infinity nor negative infinity nor Not A Number floating point representations.

640

T
toby 已提交
641
##### `TEST_ASSERT_FLOAT_IS_NOT_INF (actual)`
642 643

Asserts that `actual` parameter is a value other than positive infinity floating
T
toby 已提交
644 645
point representation.

646

T
toby 已提交
647
##### `TEST_ASSERT_FLOAT_IS_NOT_NEG_INF (actual)`
648 649

Asserts that `actual` parameter is a value other than negative infinity floating
T
toby 已提交
650 651
point representation.

652

T
toby 已提交
653
##### `TEST_ASSERT_FLOAT_IS_NOT_NAN (actual)`
654 655

Asserts that `actual` parameter is a value other than Not A Number floating
T
toby 已提交
656 657
point representation.

658

T
toby 已提交
659
##### `TEST_ASSERT_FLOAT_IS_NOT_DETERMINATE (actual)`
660 661 662

Asserts that `actual` parameter is not usable for mathematical operations. That
is, the `actual` parameter is either positive infinity or negative infinity or
T
toby 已提交
663 664
Not A Number floating point representations.

665

T
toby 已提交
666
### Double (If enabled)
667

T
toby 已提交
668
##### `TEST_ASSERT_DOUBLE_WITHIN (delta, expected, actual)`
669 670 671

Asserts that the `actual` value is within +/- `delta` of the `expected` value.
The nature of floating point representation is such that exact evaluations of
T
toby 已提交
672 673
equality are not guaranteed.

674

T
toby 已提交
675
##### `TEST_ASSERT_EQUAL_DOUBLE (expected, actual)`
676 677 678 679 680 681 682

Asserts that the `actual` value is "close enough to be considered equal" to the
`expected` value. If you are curious about the details, refer to the Advanced
Asserting section for more details. Omitting a user-specified delta in a
floating point assertion is both a shorthand convenience and a requirement of
code generation conventions for CMock.

T
toby 已提交
683 684

##### `TEST_ASSERT_EQUAL_DOUBLE_ARRAY (expected, actual, num_elements)`
685 686 687 688

See Array assertion section for details. Note that individual array element
double comparisons are executed using `TEST_ASSERT_EQUAL_DOUBLE`.That is, user
specified delta comparison values requires a custom implemented double array
T
toby 已提交
689 690
assertion.

691

T
toby 已提交
692
##### `TEST_ASSERT_DOUBLE_IS_INF (actual)`
693 694

Asserts that `actual` parameter is equivalent to positive infinity floating
T
toby 已提交
695 696
point representation.

697

T
toby 已提交
698
##### `TEST_ASSERT_DOUBLE_IS_NEG_INF (actual)`
699 700

Asserts that `actual` parameter is equivalent to negative infinity floating point
T
toby 已提交
701 702
representation.

703

T
toby 已提交
704
##### `TEST_ASSERT_DOUBLE_IS_NAN (actual)`
705

T
toby 已提交
706 707
Asserts that `actual` parameter is a Not A Number floating point representation.

708

T
toby 已提交
709
##### `TEST_ASSERT_DOUBLE_IS_DETERMINATE (actual)`
710 711 712

Asserts that `actual` parameter is a floating point representation usable for
mathematical operations. That is, the ?actual?parameter is neither positive
T
toby 已提交
713 714
infinity nor negative infinity nor Not A Number floating point representations.

715

T
toby 已提交
716
##### `TEST_ASSERT_DOUBLE_IS_NOT_INF (actual)`
717 718

Asserts that `actual` parameter is a value other than positive infinity floating
T
toby 已提交
719 720
point representation.

721

T
toby 已提交
722
##### `TEST_ASSERT_DOUBLE_IS_NOT_NEG_INF (actual)`
723 724

Asserts that `actual` parameter is a value other than negative infinity floating
T
toby 已提交
725 726
point representation.

727

T
toby 已提交
728
##### `TEST_ASSERT_DOUBLE_IS_NOT_NAN (actual)`
729 730

Asserts that `actual` parameter is a value other than Not A Number floating
T
toby 已提交
731 732
point representation.

733

T
toby 已提交
734
##### `TEST_ASSERT_DOUBLE_IS_NOT_DETERMINATE (actual)`
735 736 737

Asserts that `actual` parameter is not usable for mathematical operations. That
is, the `actual` parameter is either positive infinity or negative infinity or
T
toby 已提交
738 739
Not A Number floating point representations.

740

T
toby 已提交
741
## Advanced Asserting: Details On Tricky Assertions
742 743 744 745 746 747 748

This section helps you understand how to deal with some of the trickier
assertion situations you may run into. It will give you a glimpse into some of
the under-the-hood details of Unity's assertion mechanisms. If you're one of
those people who likes to know what is going on in the background, read on. If
not, feel free to ignore the rest of this document until you need it.

T
toby 已提交
749 750

### How do the EQUAL assertions work for FLOAT and DOUBLE?
751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766

As you may know, directly checking for equality between a pair of floats or a
pair of doubles is sloppy at best and an outright no-no at worst. Floating point
values can often be represented in multiple ways, particularly after a series of
operations on a value. Initializing a variable to the value of 2.0 is likely to
result in a floating point representation of 2 x 20,but a series of
mathematical operations might result in a representation of 8 x 2-2
that also evaluates to a value of 2. At some point repeated operations cause
equality checks to fail.

So Unity doesn't do direct floating point comparisons for equality. Instead, it
checks if two floating point values are "really close." If you leave Unity
running with defaults, "really close" means "within a significant bit or two."
Under the hood, `TEST_ASSERT_EQUAL_FLOAT` is really `TEST_ASSERT_FLOAT_WITHIN`
with the `delta` parameter calculated on the fly. For single precision, delta is
the expected value multiplied by 0.00001, producing a very small proportional
T
toby 已提交
767 768
range around the expected value.

769 770 771 772
If you are expecting a value of 20,000.0 the delta is calculated to be 0.2. So
any value between 19,999.8 and 20,000.2 will satisfy the equality check. This
works out to be roughly a single bit of range for a single-precision number, and
that's just about as tight a tolerance as you can reasonably get from a floating
T
toby 已提交
773 774
point value.

775 776
So what happens when it's zero? Zero - even more than other floating point
values - can be represented many different ways. It doesn't matter if you have
D
Deryew 已提交
777
0 x 20 or 0 x 263.It's still zero, right? Luckily, if you
778 779
subtract these values from each other, they will always produce a difference of
zero, which will still fall between 0 plus or minus a delta of 0. So it still
T
toby 已提交
780 781
works!

782
Double precision floating point numbers use a much smaller multiplier, again
T
toby 已提交
783 784
approximating a single bit of error.

785 786 787
If you don't like these ranges and you want to make your floating point equality
assertions less strict, you can change these multipliers to whatever you like by
defining UNITY_FLOAT_PRECISION and UNITY_DOUBLE_PRECISION. See Unity
T
toby 已提交
788 789
documentation for more.

790

T
toby 已提交
791
### How do we deal with targets with non-standard int sizes?
792 793 794 795 796

It's "fun" that C is a standard where something as fundamental as an integer
varies by target. According to the C standard, an `int` is to be the target's
natural register size, and it should be at least 16-bits and a multiple of a
byte. It also guarantees an order of sizes:
T
toby 已提交
797 798 799 800 801

```C
char <= short <= int <= long <= long long
```

802 803
Most often, `int` is 32-bits. In many cases in the embedded world, `int` is
16-bits. There are rare microcontrollers out there that have 24-bit integers,
T
toby 已提交
804 805
and this remains perfectly standard C.

806 807 808 809 810
To make things even more interesting, there are compilers and targets out there
that have a hard choice to make. What if their natural register size is 10-bits
or 12-bits? Clearly they can't fulfill _both_ the requirement to be at least
16-bits AND the requirement to match the natural register size. In these
situations, they often choose the natural register size, leaving us with
T
toby 已提交
811 812 813 814 815 816
something like this:

```C
char (8 bit) <= short (12 bit) <= int (12 bit) <= long (16 bit)
```

817
Um... yikes. It's obviously breaking a rule or two... but they had to break SOME
T
toby 已提交
818 819
rules, so they made a choice.

820 821 822 823
When the C99 standard rolled around, it introduced alternate standard-size types.
It also introduced macros for pulling in MIN/MAX values for your integer types.
It's glorious! Unfortunately, many embedded compilers can't be relied upon to
use the C99 types (Sometimes because they have weird register sizes as described
T
toby 已提交
824 825
above. Sometimes because they don't feel like it?).

826 827 828
A goal of Unity from the beginning was to support every combination of
microcontroller or microprocessor and C compiler. Over time, we've gotten really
close to this. There are a few tricks that you should be aware of, though, if
T
toby 已提交
829 830
you're going to do this effectively on some of these more idiosyncratic targets.

831 832 833
First, when setting up Unity for a new target, you're going to want to pay
special attention to the macros for automatically detecting types
(where available) or manually configuring them yourself. You can get information
T
toby 已提交
834 835
on both of these in Unity's documentation.

836 837 838 839
What about the times where you suddenly need to deal with something odd, like a
24-bit `int`? The simplest solution is to use the next size up. If you have a
24-bit `int`, configure Unity to use 32-bit integers. If you have a 12-bit
`int`, configure Unity to use 16 bits. There are two ways this is going to
T
toby 已提交
840 841
affect you:

842
1. When Unity displays errors for you, it's going to pad the upper unused bits
T
toby 已提交
843
with zeros.
844 845 846
2. You're going to have to be careful of assertions that perform signed
operations, particularly `TEST_ASSERT_INT_WITHIN`.Such assertions might wrap
your `int` in the wrong place, and you could experience false failures. You can
M
Mark VanderVoord 已提交
847 848 849 850
always back down to a simple `TEST_ASSERT` and do the operations yourself.


*Find The Latest of This And More at [ThrowTheSwitch.org](https://throwtheswitch.org)*