Skip to content

Commit 4d64a17

Browse files
committed
Documentation improvements
* Fixed a broken markdown bulleted list * Replaced a missing document link (from the original source of this documentation) with a full sentence explaining the relation of `assert()` to static analysis. * Typographic fixes * Replaced single and double straight quotes with smart quotes where appropriate * Replaced three periods with ellipses where appropriate
1 parent bbb8b3f commit 4d64a17

File tree

1 file changed

+52
-53
lines changed

1 file changed

+52
-53
lines changed

docs/UnityAssertionsReference.md

+52-53
Original file line numberDiff line numberDiff line change
@@ -10,46 +10,46 @@ Upon boolean False, an assertion stops execution and reports the failure.
1010
and easily execute those assertions.
1111
- The structure of Unity allows you to easily separate test assertions from
1212
source code in, well, test code.
13-
- Unity's assertions:
14-
- Come in many, many flavors to handle different C types and assertion cases.
15-
- Use context to provide detailed and helpful failure messages.
16-
- Document types, expected values, and basic behavior in your source code for
13+
- Unitys assertions:
14+
- Come in many, many flavors to handle different C types and assertion cases.
15+
- Use context to provide detailed and helpful failure messages.
16+
- Document types, expected values, and basic behavior in your source code for
1717
free.
1818

19-
### Unity Is Several Things But Mainly It's Assertions
19+
### Unity Is Several Things But Mainly Its Assertions
2020

2121
One way to think of Unity is simply as a rich collection of assertions you can
2222
use to establish whether your source code behaves the way you think it does.
2323
Unity provides a framework to easily organize and execute those assertions in
2424
test code separate from your source code.
2525

26-
### What's an Assertion?
26+
### Whats an Assertion?
2727

2828
At their core, assertions are an establishment of truth - boolean truth. Was this
2929
thing equal to that thing? Does that code doohickey have such-and-such property
30-
or not? You get the idea. Assertions are executable code (to appreciate the big
31-
picture on this read up on the difference between
32-
[link:Dynamic Verification and Static Analysis]). A failing assertion stops
33-
execution and reports an error through some appropriate I/O channel (e.g.
34-
stdout, GUI, file, blinky light).
30+
or not? You get the idea. Assertions are executable code. Static analysis is a
31+
valuable approach to improving code quality, but it is not executing your code
32+
in the way an assertion can. A failing assertion stops execution and reports an
33+
error through some appropriate I/O channel (e.g. stdout, GUI, output file,
34+
blinky light).
3535

3636
Fundamentally, for dynamic verification all you need is a single assertion
37-
mechanism. In fact, that's what the [assert() macro][] in C's standard library
37+
mechanism. In fact, thats what the [assert() macro][] in Cs standard library
3838
is for. So why not just use it? Well, we can do far better in the reporting
39-
department. C's `assert()` is pretty dumb as-is and is particularly poor for
39+
department. Cs `assert()` is pretty dumb as-is and is particularly poor for
4040
handling common data types like arrays, structs, etc. And, without some other
41-
support, it's far too tempting to litter source code with C's `assert()`'s. It's
41+
support, its far too tempting to litter source code with Cs `assert()`s. Its
4242
generally much cleaner, manageable, and more useful to separate test and source
4343
code in the way Unity facilitates.
4444

45-
### Unity's Assertions: Helpful Messages _and_ Free Source Code Documentation
45+
### Unitys Assertions: Helpful Messages _and_ Free Source Code Documentation
4646

4747
Asserting a simple truth condition is valuable, but using the context of the
48-
assertion is even more valuable. For instance, if you know you're comparing bit
48+
assertion is even more valuable. For instance, if you know youre comparing bit
4949
flags and not just integers, then why not use that context to give explicit,
5050
readable, bit-level feedback when an assertion fails?
5151

52-
That's what Unity's collection of assertions do - capture context to give you
52+
Thats what Unitys collection of assertions do - capture context to give you
5353
helpful, meaningful assertion failure messages. In fact, the assertions
5454
themselves also serve as executable documentation about types and values in your
5555
source code. So long as your tests remain current with your source and all those
@@ -73,12 +73,12 @@ a simple null check).
7373
- `Actual` is the value being tested and unlike the other parameters in an
7474
assertion construction is the only parameter present in all assertion variants.
7575
- `Modifiers` are masks, ranges, bit flag specifiers, floating point deltas.
76-
- `Expected` is your expected value (duh) to compare to an `actual` value; it's
76+
- `Expected` is your expected value (duh) to compare to an `actual` value; its
7777
marked as an optional parameter because some assertions only need a single
7878
`actual` parameter (e.g. null check).
7979
- `Size/count` refers to string lengths, number of array elements, etc.
8080
81-
Many of Unity's assertions are clear duplications in that the same data type
81+
Many of Unitys assertions are clear duplications in that the same data type
8282
is handled by several assertions. The differences among these are in how failure
8383
messages are presented. For instance, a `_HEX` variant of an assertion prints
8484
the expected and actual values of that assertion formatted as hexadecimal.
@@ -99,7 +99,7 @@ _Example:_
9999
TEST_ASSERT_X( {modifiers}, {expected}, actual, {size/count} )
100100
```
101101

102-
becomes messageified like thus...
102+
becomes messageified like thus
103103

104104
```c
105105
TEST_ASSERT_X_MESSAGE( {modifiers}, {expected}, actual, {size/count}, message )
@@ -108,7 +108,7 @@ TEST_ASSERT_X_MESSAGE( {modifiers}, {expected}, actual, {size/count}, message )
108108
Notes:
109109
110110
- The `_MESSAGE` variants intentionally do not support `printf` style formatting
111-
since many embedded projects don't support or avoid `printf` for various reasons.
111+
since many embedded projects dont support or avoid `printf` for various reasons.
112112
It is possible to use `sprintf` before the assertion to assemble a complex fail
113113
message, if necessary.
114114
- If you want to output a counter value within an assertion fail message (e.g. from
@@ -119,7 +119,7 @@ Notes:
119119
120120
Unity provides a collection of assertions for arrays containing a variety of
121121
types. These are documented in the Array section below. These are almost on par
122-
with the `_MESSAGE`variants of Unity's Asserts in that for pretty much any Unity
122+
with the `_MESSAGE`variants of Unitys Asserts in that for pretty much any Unity
123123
type assertion you can tack on `_ARRAY` and run assertions on an entire block of
124124
memory.
125125
@@ -144,7 +144,7 @@ Notes:
144144
Unity provides a collection of assertions for arrays containing a variety of
145145
types which can be compared to a single value as well. These are documented in
146146
the Each Equal section below. these are almost on par with the `_MESSAGE`
147-
variants of Unity's Asserts in that for pretty much any Unity type assertion you
147+
variants of Unitys Asserts in that for pretty much any Unity type assertion you
148148
can inject `_EACH_EQUAL` and run assertions on an entire block of memory.
149149

150150
```c
@@ -203,7 +203,7 @@ code then verifies as a final step.
203203
#### `TEST_PASS_MESSAGE("message")`
204204
205205
This will abort the remainder of the test, but count the test as a pass. Under
206-
normal circumstances, it is not necessary to include this macro in your tests...
206+
normal circumstances, it is not necessary to include this macro in your tests
207207
a lack of failure will automatically be counted as a `PASS`. It is occasionally
208208
useful for tests with `#ifdef`s and such.
209209
@@ -392,7 +392,7 @@ Asserts that the pointers point to the same memory location.
392392
393393
#### `TEST_ASSERT_EQUAL_STRING (expected, actual)`
394394
395-
Asserts that the null terminated (`'\0'`)strings are identical. If strings are
395+
Asserts that the null terminated (`’\0’`)strings are identical. If strings are
396396
of different lengths or any portion of the strings before their terminators
397397
differ, the assertion fails. Two NULL strings (i.e. zero length) are considered
398398
equivalent.
@@ -561,15 +561,15 @@ Asserts that the `actual` value is NOT within +/- `delta` of the `expected` valu
561561
562562
#### `TEST_ASSERT_EQUAL_FLOAT (expected, actual)`
563563
564-
Asserts that the `actual` value is "close enough to be considered equal" to the
564+
Asserts that the `actual` value is close enough to be considered equal to the
565565
`expected` value. If you are curious about the details, refer to the Advanced
566566
Asserting section for more details on this. Omitting a user-specified delta in a
567567
floating point assertion is both a shorthand convenience and a requirement of
568568
code generation conventions for CMock.
569569
570570
#### `TEST_ASSERT_NOT_EQUAL_FLOAT (expected, actual)`
571571
572-
Asserts that the `actual` value is NOT "close enough to be considered equal" to the
572+
Asserts that the `actual` value is NOT close enough to be considered equal to the
573573
`expected` value.
574574
575575
#### `TEST_ASSERT_FLOAT_ARRAY_WITHIN (delta, expected, actual, num_elements)`
@@ -662,15 +662,15 @@ Asserts that the `actual` value is NOT within +/- `delta` of the `expected` valu
662662
663663
#### `TEST_ASSERT_EQUAL_DOUBLE (expected, actual)`
664664
665-
Asserts that the `actual` value is "close enough to be considered equal" to the
665+
Asserts that the `actual` value is close enough to be considered equal to the
666666
`expected` value. If you are curious about the details, refer to the Advanced
667667
Asserting section for more details. Omitting a user-specified delta in a
668668
floating point assertion is both a shorthand convenience and a requirement of
669669
code generation conventions for CMock.
670670
671671
#### `TEST_ASSERT_NOT_EQUAL_DOUBLE (expected, actual)`
672672
673-
Asserts that the `actual` value is NOT "close enough to be considered equal" to the
673+
Asserts that the `actual` value is NOT close enough to be considered equal to the
674674
`expected` value.
675675
676676
#### `TEST_ASSERT_DOUBLE_ARRAY_WITHIN (delta, expected, actual, num_elements)`
@@ -753,7 +753,7 @@ Not A Number floating point representations.
753753
754754
This section helps you understand how to deal with some of the trickier
755755
assertion situations you may run into. It will give you a glimpse into some of
756-
the under-the-hood details of Unity's assertion mechanisms. If you're one of
756+
the under-the-hood details of Unitys assertion mechanisms. If youre one of
757757
those people who likes to know what is going on in the background, read on. If
758758
not, feel free to ignore the rest of this document until you need it.
759759
@@ -768,9 +768,9 @@ mathematical operations might result in a representation of 8 x 2-2
768768
that also evaluates to a value of 2. At some point repeated operations cause
769769
equality checks to fail.
770770
771-
So Unity doesn't do direct floating point comparisons for equality. Instead, it
772-
checks if two floating point values are "really close." If you leave Unity
773-
running with defaults, "really close" means "within a significant bit or two."
771+
So Unity doesnt do direct floating point comparisons for equality. Instead, it
772+
checks if two floating point values are really close. If you leave Unity
773+
running with defaults, really close means within a significant bit or two.
774774
Under the hood, `TEST_ASSERT_EQUAL_FLOAT` is really `TEST_ASSERT_FLOAT_WITHIN`
775775
with the `delta` parameter calculated on the fly. For single precision, delta is
776776
the expected value multiplied by 0.00001, producing a very small proportional
@@ -779,28 +779,27 @@ range around the expected value.
779779
If you are expecting a value of 20,000.0 the delta is calculated to be 0.2. So
780780
any value between 19,999.8 and 20,000.2 will satisfy the equality check. This
781781
works out to be roughly a single bit of range for a single-precision number, and
782-
that's just about as tight a tolerance as you can reasonably get from a floating
782+
thats just about as tight a tolerance as you can reasonably get from a floating
783783
point value.
784784
785-
So what happens when it's zero? Zero - even more than other floating point
786-
values - can be represented many different ways. It doesn't matter if you have
787-
0 x 20 or 0 x 263.It's still zero, right? Luckily, if you
788-
subtract these values from each other, they will always produce a difference of
789-
zero, which will still fall between 0 plus or minus a delta of 0. So it still
790-
works!
785+
So what happens when it’s zero? Zero - even more than other floating point
786+
values - can be represented many different ways. It doesn’t matter if you have
787+
0x20 or 0x263. It’s still zero, right? Luckily, if you subtract these
788+
values from each other, they will always produce a difference of zero, which
789+
will still fall between 0 plus or minus a delta of 0. So it still works!
791790
792791
Double precision floating point numbers use a much smaller multiplier, again
793792
approximating a single bit of error.
794793
795-
If you don't like these ranges and you want to make your floating point equality
794+
If you dont like these ranges and you want to make your floating point equality
796795
assertions less strict, you can change these multipliers to whatever you like by
797796
defining UNITY_FLOAT_PRECISION and UNITY_DOUBLE_PRECISION. See Unity
798797
documentation for more.
799798
800799
### How do we deal with targets with non-standard int sizes?
801800
802-
It's "fun" that C is a standard where something as fundamental as an integer
803-
varies by target. According to the C standard, an `int` is to be the target's
801+
It’s “fun that C is a standard where something as fundamental as an integer
802+
varies by target. According to the C standard, an `int` is to be the targets
804803
natural register size, and it should be at least 16-bits and a multiple of a
805804
byte. It also guarantees an order of sizes:
806805
@@ -814,7 +813,7 @@ and this remains perfectly standard C.
814813

815814
To make things even more interesting, there are compilers and targets out there
816815
that have a hard choice to make. What if their natural register size is 10-bits
817-
or 12-bits? Clearly they can't fulfill _both_ the requirement to be at least
816+
or 12-bits? Clearly they cant fulfill _both_ the requirement to be at least
818817
16-bits AND the requirement to match the natural register size. In these
819818
situations, they often choose the natural register size, leaving us with
820819
something like this:
@@ -823,34 +822,34 @@ something like this:
823822
char (8 bit) <= short (12 bit) <= int (12 bit) <= long (16 bit)
824823
```
825824

826-
Um... yikes. It's obviously breaking a rule or two... but they had to break SOME
825+
Um yikes. Its obviously breaking a rule or two but they had to break SOME
827826
rules, so they made a choice.
828827

829828
When the C99 standard rolled around, it introduced alternate standard-size types.
830829
It also introduced macros for pulling in MIN/MAX values for your integer types.
831-
It's glorious! Unfortunately, many embedded compilers can't be relied upon to
830+
Its glorious! Unfortunately, many embedded compilers cant be relied upon to
832831
use the C99 types (Sometimes because they have weird register sizes as described
833-
above. Sometimes because they don't feel like it?).
832+
above. Sometimes because they dont feel like it?).
834833

835834
A goal of Unity from the beginning was to support every combination of
836-
microcontroller or microprocessor and C compiler. Over time, we've gotten really
835+
microcontroller or microprocessor and C compiler. Over time, weve gotten really
837836
close to this. There are a few tricks that you should be aware of, though, if
838-
you're going to do this effectively on some of these more idiosyncratic targets.
837+
youre going to do this effectively on some of these more idiosyncratic targets.
839838

840-
First, when setting up Unity for a new target, you're going to want to pay
839+
First, when setting up Unity for a new target, youre going to want to pay
841840
special attention to the macros for automatically detecting types
842841
(where available) or manually configuring them yourself. You can get information
843-
on both of these in Unity's documentation.
842+
on both of these in Unitys documentation.
844843

845844
What about the times where you suddenly need to deal with something odd, like a
846845
24-bit `int`? The simplest solution is to use the next size up. If you have a
847846
24-bit `int`, configure Unity to use 32-bit integers. If you have a 12-bit
848847
`int`, configure Unity to use 16 bits. There are two ways this is going to
849848
affect you:
850849

851-
1. When Unity displays errors for you, it's going to pad the upper unused bits
850+
1. When Unity displays errors for you, its going to pad the upper unused bits
852851
with zeros.
853-
2. You're going to have to be careful of assertions that perform signed
852+
2. Youre going to have to be careful of assertions that perform signed
854853
operations, particularly `TEST_ASSERT_INT_WITHIN`. Such assertions might wrap
855854
your `int` in the wrong place, and you could experience false failures. You can
856855
always back down to a simple `TEST_ASSERT` and do the operations yourself.

0 commit comments

Comments
 (0)