<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Maxime Soulé</title>
    <description>The latest articles on DEV Community by Maxime Soulé (@maxatome).</description>
    <link>https://dev.to/maxatome</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F181779%2Fcd788646-da54-4537-a814-8de3382c31e6.jpeg</url>
      <title>DEV Community: Maxime Soulé</title>
      <link>https://dev.to/maxatome</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/maxatome"/>
    <language>en</language>
    <item>
      <title>[ANN] go-testdeep v1.13.0 is available</title>
      <dc:creator>Maxime Soulé</dc:creator>
      <pubDate>Mon, 20 Mar 2023 22:04:43 +0000</pubDate>
      <link>https://dev.to/maxatome/ann-go-testdeep-v1130-is-out-1ipe</link>
      <guid>https://dev.to/maxatome/ann-go-testdeep-v1130-is-out-1ipe</guid>
      <description>&lt;p&gt;A new release of &lt;a href="https://go-testdeep.zetta.rocks"&gt;go-testdeep&lt;/a&gt; has just been published.&lt;/p&gt;

&lt;p&gt;As a remainder, &lt;a href="https://go-testdeep.zetta.rocks"&gt;go-testdeep&lt;/a&gt; is a powerful golang tests framework, using a comparison engine of its own and providing 67 operators to compare anything, in any situation, at any nested level.&lt;/p&gt;

&lt;p&gt;Major features in this release follow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;5 new operators are available, allowing to test wrapped errors (&lt;a href="https://go-testdeep.zetta.rocks/operators/erroris/"&gt;ErrorIs&lt;/a&gt;), channels content (&lt;a href="https://go-testdeep.zetta.rocks/operators/erroris/"&gt;Recv&lt;/a&gt;) and only some elements of slices/arrays (&lt;a href="https://go-testdeep.zetta.rocks/operators/first/"&gt;First&lt;/a&gt;, &lt;a href="https://go-testdeep.zetta.rocks/operators/grep/"&gt;Grep&lt;/a&gt; &amp;amp; &lt;a href="https://go-testdeep.zetta.rocks/operators/last/"&gt;Last&lt;/a&gt;);&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://go-testdeep.zetta.rocks/operators/json/"&gt;JSON operator&lt;/a&gt; reaches an unmatched level so far, making it definitely the best solution to do JSON comparisons in golang world;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://go-testdeep.zetta.rocks/faq/#how-does-operator-anchoring-work"&gt;unique anchoring feature&lt;/a&gt; is now available using a new generic way, a must! ;)&lt;/li&gt;
&lt;li&gt;others details can be found &lt;a href="https://github.com/maxatome/go-testdeep/releases/tag/v1.13.0"&gt;on the release page&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;

&lt;p&gt;Home: &lt;a href="https://go-testdeep.zetta.rocks"&gt;https://go-testdeep.zetta.rocks&lt;/a&gt;&lt;br&gt;
Repo: &lt;a href="https://github.com/maxatome/go-testdeep"&gt;https://github.com/maxatome/go-testdeep&lt;/a&gt;&lt;br&gt;
Godoc: &lt;a href="https://pkg.go.dev/github.com/maxatome/go-testdeep/td"&gt;https://pkg.go.dev/github.com/maxatome/go-testdeep/td&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PS: don't mistake &lt;a href="https://github.com/maxatome/go-testdeep"&gt;go-testdeep&lt;/a&gt; for go-test/deep, both are a tests framework, but &lt;a href="https://github.com/maxatome/go-testdeep"&gt;go-testdeep&lt;/a&gt; is much more powerful in every situations.&lt;/p&gt;

</description>
      <category>go</category>
      <category>framework</category>
      <category>testing</category>
      <category>testdeep</category>
    </item>
    <item>
      <title>Large repo switched to new go1.19 doc comments</title>
      <dc:creator>Maxime Soulé</dc:creator>
      <pubDate>Sun, 07 Aug 2022 19:08:33 +0000</pubDate>
      <link>https://dev.to/maxatome/large-repo-switched-to-new-go119-doc-comments-4i2m</link>
      <guid>https://dev.to/maxatome/large-repo-switched-to-new-go119-doc-comments-4i2m</guid>
      <description>&lt;p&gt;go 1.19 introduces new doc comments formatting features, allowing to easily insert links and lists.&lt;/p&gt;

&lt;p&gt;Details are described here → &lt;a href="https://go.dev/doc/comment"&gt;https://go.dev/doc/comment&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Links &amp;amp; lists
&lt;/h2&gt;

&lt;p&gt;Links are probably the most interesting feature as they permit to enhance the documentation by providing users hints without inserting full URL as one needs before:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// The allowed shortcut operators follow:&lt;/span&gt;
&lt;span class="c"&gt;//   - [Empty]    → $^Empty&lt;/span&gt;
&lt;span class="c"&gt;//   - [Ignore]   → $^Ignore&lt;/span&gt;
&lt;span class="c"&gt;//   - [NaN]      → $^NaN&lt;/span&gt;
&lt;span class="c"&gt;//   - [Nil]      → $^Nil&lt;/span&gt;
&lt;span class="c"&gt;//   - [NotEmpty] → $^NotEmpty&lt;/span&gt;
&lt;span class="c"&gt;//   - [NotNaN]   → $^NotNaN&lt;/span&gt;
&lt;span class="c"&gt;//   - [NotNil]   → $^NotNil&lt;/span&gt;
&lt;span class="c"&gt;//   - [NotZero]  → $^NotZero&lt;/span&gt;
&lt;span class="c"&gt;//   - [Zero]     → $^Zero&lt;/span&gt;
&lt;span class="c"&gt;//&lt;/span&gt;
&lt;span class="c"&gt;// TypeBehind method returns the [reflect.Type] of the expectedJSON&lt;/span&gt;
&lt;span class="c"&gt;// once JSON unmarshaled. So it can be bool, string, float64, []any,&lt;/span&gt;
&lt;span class="c"&gt;// map[string]any or any in case expectedJSON is "null".&lt;/span&gt;
&lt;span class="c"&gt;//&lt;/span&gt;
&lt;span class="c"&gt;// See also [JSONPointer], [SubJSONOf] and [SuperJSONOf].&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;produces:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6REmkMej--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cs6egeix6o7n3d080waw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6REmkMej--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cs6egeix6o7n3d080waw.png" alt="Screenshot of result" width="794" height="339"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The listing feature is also used above. Before go 1.19, indented bullets were detected as a simple code block and were displayed with a monospaced font.&lt;/p&gt;

&lt;p&gt;Links can reference local exported identifiers (like &lt;code&gt;JSONPointer&lt;/code&gt; or &lt;code&gt;SubJSONOf&lt;/code&gt;) as well as identifiers in other packages (like &lt;code&gt;reflect.Type&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;To produce links to other resources, one can now define links using the &lt;a href="https://spec.commonmark.org/0.30/#shortcut-reference-link"&gt;Markdown shortcut reference link format&lt;/a&gt; (without the optional title text) as in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// MultipartBody is a body of a multipart/form-data HTTP request (by&lt;/span&gt;
&lt;span class="c"&gt;// default, or any other multipart/… body, see MediaType field) as&lt;/span&gt;
&lt;span class="c"&gt;// defined in [RFC 2046] to be used as a [io.Reader] body of&lt;/span&gt;
&lt;span class="c"&gt;// [http.Request] and so compliant with [RFC 2388]. It implements&lt;/span&gt;
&lt;span class="c"&gt;// [io.Reader] and can only be read once. See [PostMultipartFormData]&lt;/span&gt;
&lt;span class="c"&gt;// and [TestAPI.PostMultipartFormData] for examples of use.&lt;/span&gt;
&lt;span class="c"&gt;//&lt;/span&gt;
&lt;span class="c"&gt;// [RFC 2046]: https://tools.ietf.org/html/rfc2046&lt;/span&gt;
&lt;span class="c"&gt;// [RFC 2388]: https://tools.ietf.org/html/rfc2388&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;producing:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SQDdwelA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sn75dtw270p7v42513aa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SQDdwelA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sn75dtw270p7v42513aa.png" alt="Screenshot of result" width="804" height="102"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note that these shortcuts are scoped to the comment they are declared in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Full example
&lt;/h2&gt;

&lt;p&gt;To see the result on a large repository, I adapted the comments of &lt;a href="https://go-testdeep.zetta.rocks/"&gt;go-testdeep&lt;/a&gt; to fully take advantage of these new features.&lt;/p&gt;

&lt;p&gt;You can see the result for each impacted package:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pkg.go.dev/github.com/maxatome/go-testdeep/td"&gt;https://pkg.go.dev/github.com/maxatome/go-testdeep/td&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pkg.go.dev/github.com/maxatome/go-testdeep/helpers/tdhttp"&gt;https://pkg.go.dev/github.com/maxatome/go-testdeep/helpers/tdhttp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pkg.go.dev/github.com/maxatome/go-testdeep/helpers/tdsuite"&gt;https://pkg.go.dev/github.com/maxatome/go-testdeep/helpers/tdsuite&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pkg.go.dev/github.com/maxatome/go-testdeep/helpers/tdutil"&gt;https://pkg.go.dev/github.com/maxatome/go-testdeep/helpers/tdutil&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A few remarks
&lt;/h2&gt;

&lt;p&gt;It seems that &lt;code&gt;pkg.go.dev&lt;/code&gt; hasn't handled &lt;code&gt;[links]&lt;/code&gt; in lists yet. I say "yet", because the last version of &lt;a href="https://pkg.go.dev/golang.org/x/tools/godoc"&gt;godoc&lt;/a&gt; handles them properly. So I suppose it will be fixed soon.&lt;/p&gt;

&lt;p&gt;Struct fields links work for standard packages, but not for local/current one. For example &lt;code&gt;[http.Cookie.Raw]&lt;/code&gt; produces a link to the &lt;code&gt;Raw&lt;/code&gt; field of &lt;code&gt;Cookie&lt;/code&gt; in &lt;code&gt;net/http&lt;/code&gt; package (&lt;a href="https://pkg.go.dev/net/http#Cookie.Raw"&gt;example&lt;/a&gt;), but in go-testdeep &lt;a href="https://pkg.go.dev/github.com/maxatome/go-testdeep/td"&gt;td&lt;/a&gt; package &lt;code&gt;[ContextConfig.RootName]&lt;/code&gt; remains intact and so is not changed into a link, even when using the last version of &lt;code&gt;godoc&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Links are not handled in &lt;code&gt;var&lt;/code&gt; or &lt;code&gt;const&lt;/code&gt; comments when a single keyword groups several declarations:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// DefaultContextConfig is the default configuration used to render&lt;/span&gt;
&lt;span class="c"&gt;// tests failures. If overridden, new settings will impact all Cmp*&lt;/span&gt;
&lt;span class="c"&gt;// functions and [*T] methods (if not specifically configured.)&lt;/span&gt;
&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;DefaultContextConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ContextConfig&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;…&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is OK, but:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="c"&gt;// DefaultContextConfig is the default configuration used to render&lt;/span&gt;
  &lt;span class="c"&gt;// tests failures. If overridden, new settings will impact all Cmp*&lt;/span&gt;
  &lt;span class="c"&gt;// functions and [*T] methods (if not specifically configured.)&lt;/span&gt;
  &lt;span class="n"&gt;DefaultContextConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ContextConfig&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;does not work, &lt;code&gt;[*T]&lt;/code&gt; remains intact in generated godoc. It is too bad.&lt;/p&gt;

&lt;h2&gt;
  
  
  Some ideas
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;[x]&lt;/code&gt; could be a builtin pointing to &lt;code&gt;https://pkg.go.dev/builtin#x&lt;/code&gt;, like &lt;a href="https://pkg.go.dev/builtin#error"&gt;&lt;code&gt;error&lt;/code&gt;&lt;/a&gt; for example, for all native types, as we see them in signatures.&lt;/p&gt;

&lt;p&gt;It could be cool to have shortcut reference links global to the package, perhaps in the package doc itself. It would avoid to declare in each comment the same shortcut again and again.&lt;/p&gt;

&lt;p&gt;It can be interesting that the shortcut reference links accept indirect URLs. For example, in &lt;a href="https://pkg.go.dev/github.com/maxatome/go-testdeep/td"&gt;td&lt;/a&gt; I often talk about &lt;code&gt;Cmp*&lt;/code&gt; functions. Each time, I would like to reference &lt;a href="https://pkg.go.dev/github.com/maxatome/go-testdeep/td#Cmp"&gt;&lt;code&gt;Cmp&lt;/code&gt;&lt;/a&gt; function (the first one of the &lt;code&gt;Cmp*&lt;/code&gt; serie). To do it, I have to set the full URL in the shortcut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// [Cmp*]: https://pkg.go.dev/github.com/maxatome/go-testdeep/td#Cmp&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;while simply using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// [Cmp*]: Cmp&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;would avoid referencing &lt;code&gt;pkg.go.dev&lt;/code&gt; as &lt;code&gt;[Cmp]&lt;/code&gt; does elsewhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The result of using these new features is pretty cool. Let's hope that package authors will enhance their docs to help their users to easily discover their APIs, in a more friendly way.&lt;/p&gt;

</description>
      <category>godoc</category>
      <category>gotestdeep</category>
      <category>go</category>
    </item>
    <item>
      <title>Install ImageMagick6 *and* ImageMagick7 on FreeBSD</title>
      <dc:creator>Maxime Soulé</dc:creator>
      <pubDate>Fri, 01 May 2020 21:28:15 +0000</pubDate>
      <link>https://dev.to/maxatome/install-imagemagick6-and-imagemagick7-on-freebsd-9hf</link>
      <guid>https://dev.to/maxatome/install-imagemagick6-and-imagemagick7-on-freebsd-9hf</guid>
      <description>&lt;p&gt;On FreeBSD, &lt;code&gt;ImageMagick6&lt;/code&gt; and &lt;code&gt;ImageMagick7&lt;/code&gt; packages cannot be installed at the same time as they have several files in common.&lt;/p&gt;

&lt;p&gt;It becomes a problem when some packages depend on &lt;code&gt;ImageMagick6&lt;/code&gt; (as &lt;code&gt;inkscape&lt;/code&gt; for example) and some others on &lt;code&gt;ImageMagick7&lt;/code&gt; (as &lt;code&gt;emacs&lt;/code&gt; for example).&lt;/p&gt;

&lt;p&gt;To circumvent this problem, we can "patch" the &lt;code&gt;ImageMagick6&lt;/code&gt; package to delete the files installed by &lt;code&gt;ImageMagick7&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;So &lt;code&gt;ImageMagick7&lt;/code&gt; is installed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ pkg info ImageMagick\*                              
ImageMagick7-7.0.10.6
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;First download the &lt;code&gt;ImageMagick6&lt;/code&gt; package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ pkg=$(pkg rquery %q/%n-%v ImageMagick6)
$ fetch https://pkg.freebsd.org/${pkg%%/*}/latest/All/${pkg#*/}.txz
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Then download the "package-patcher" script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ fetch https://gist.githubusercontent.com/maxatome/dcd48de511f087c10f02a59405f134b6/raw/9e9843d87dace00e506ea848c69cf29ad09dbf6a/patch-ImageMagick6.pl
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Do not forget&lt;/strong&gt; to &lt;a href="https://gist.github.com/maxatome/dcd48de511f087c10f02a59405f134b6"&gt;look at its content&lt;/a&gt; before executing it!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://gist.github.com/maxatome/dcd48de511f087c10f02a59405f134b6#file-patch-imagemagick6-pl-L27"&gt;L27&lt;/a&gt; it creates a temporary directory that it automatically cleaned up at end;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://gist.github.com/maxatome/dcd48de511f087c10f02a59405f134b6#file-patch-imagemagick6-pl-L29-L31"&gt;L29-31&lt;/a&gt; it extracts the package it it&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://gist.github.com/maxatome/dcd48de511f087c10f02a59405f134b6#file-patch-imagemagick6-pl-L33-L34"&gt;L33-34&lt;/a&gt; it reads the &lt;code&gt;+MANIFEST&lt;/code&gt; to get the list of package files;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://gist.github.com/maxatome/dcd48de511f087c10f02a59405f134b6#file-patch-imagemagick6-pl-L36-L57"&gt;L36-57&lt;/a&gt; it deletes unneeded files from &lt;code&gt;+MANIFEST&lt;/code&gt; and from disk&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://gist.github.com/maxatome/dcd48de511f087c10f02a59405f134b6#file-patch-imagemagick6-pl-L59-L63"&gt;L59-63&lt;/a&gt; it rewrites the &lt;code&gt;+MANIFEST&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://gist.github.com/maxatome/dcd48de511f087c10f02a59405f134b6#file-patch-imagemagick6-pl-L65-L75"&gt;L65-75&lt;/a&gt; it creates a new package adding &lt;code&gt;-libonly&lt;/code&gt; to the original package name.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then (no need to be root at this step), patch the package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ perl patch-ImageMagick6.pl ${pkg#*/}.txz
Extracting /usr/home/max/tmp/ImageMagick6-6.9.11.6,1.txz
tar: Removing leading '/' from member names
Patching
Creating new /usr/home/max/tmp/ImageMagick6-libonly-6.9.11.6,1.txz
/usr/home/max/tmp/ImageMagick6-libonly-6.9.11.6,1.txz produced.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Just install the produced package using &lt;code&gt;pkg install&lt;/code&gt; as &lt;code&gt;root&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# pkg install ImageMagick6-libonly-6.9.11.6,1.txz
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
Checking integrity... done (0 conflicting)
The following 1 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
    ImageMagick6: 6.9.11.6,1

Number of packages to be installed: 1

The process will require 27 MiB more space.

Proceed with this action? [y/N]: y
[1/1] Installing ImageMagick6-6.9.11.6,1...
Extracting ImageMagick6-6.9.11.6,1: 100%
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;&lt;code&gt;inkscape&lt;/code&gt; package can now be installed without any conflict with &lt;code&gt;emacs&lt;/code&gt;, as both versions of ImageMagick are installed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; pkg info ImageMagick\*                          
ImageMagick6-6.9.11.6,1
ImageMagick7-7.0.10.6
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;It is a good idea to lock the &lt;code&gt;ImageMagick6&lt;/code&gt; package to avoid that the next &lt;code&gt;pkg upgrade&lt;/code&gt; raise a conflict:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# pkg lock ImageMagick6-6.9.11.6,1 
ImageMagick6-6.9.11.6,1: lock this package? [y/N]: y
Locking ImageMagick6-6.9.11.6,1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



</description>
      <category>freebsd</category>
      <category>imagemagick</category>
      <category>package</category>
    </item>
    <item>
      <title>go-testdeep v1.4.0 released</title>
      <dc:creator>Maxime Soulé</dc:creator>
      <pubDate>Sun, 19 Apr 2020 14:43:11 +0000</pubDate>
      <link>https://dev.to/maxatome/go-testdeep-v1-4-0-released-7a</link>
      <guid>https://dev.to/maxatome/go-testdeep-v1-4-0-released-7a</guid>
      <description>&lt;p&gt;As a powerful and two-year-old testing framework, &lt;a href="https://go-testdeep.zetta.rocks/"&gt;go-testdeep&lt;/a&gt; allows you to deeply test any golang data structure. It is fully integrated with testing standard package.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="s"&gt;"testing"&lt;/span&gt;
  &lt;span class="s"&gt;"github.com/maxatome/go-testdeep/td"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;TestLoadPerson&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;testing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c"&gt;// LoadPerson() (Person, error)&lt;/span&gt;
  &lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;LoadPerson&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CmpNoError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// person has to match exactly&lt;/span&gt;
    &lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Cmp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Bob"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Age&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;24&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;But many testing frameworks allow you to do this kind of comparison, no need for a new one!&lt;/p&gt;

&lt;p&gt;As go-testdeep uses its own function to deeply compare structures, it allows you to use &lt;a href="https://go-testdeep.zetta.rocks/operators/"&gt;60 operators&lt;/a&gt; for more flexibility.&lt;/p&gt;

&lt;p&gt;Take the &lt;a href="https://go-testdeep.zetta.rocks/operators/bag/"&gt;Bag&lt;/a&gt; operator as an example:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="s"&gt;"testing"&lt;/span&gt;
  &lt;span class="s"&gt;"github.com/maxatome/go-testdeep/td"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;TestLoadPersons&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;testing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c"&gt;// LoadPersons(string) ([]Person, error)&lt;/span&gt;
  &lt;span class="n"&gt;persons&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;LoadPersons&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"B*"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CmpNoError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// persons slice has to contains these 4 persons&lt;/span&gt;
    &lt;span class="c"&gt;// in whatever order&lt;/span&gt;
    &lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Cmp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;persons&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Bag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Bob"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Age&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;24&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Britt"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Age&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;29&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Barbara"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Age&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;35&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="n"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Brian"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Age&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;21&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;It is just an example, as the tests can be much more complex. See:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the &lt;a href="https://go-testdeep.zetta.rocks/introduction/"&gt;synopsis&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://go-testdeep.zetta.rocks/example/using-testing/"&gt;an example&lt;/a&gt; from classic approach to the go-testdeep ones;&lt;/li&gt;
&lt;li&gt;the &lt;a href="https://go-testdeep.zetta.rocks/faq/"&gt;FAQ&lt;/a&gt;, it contains some examples too.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;a href="https://pkg.go.dev/github.com/maxatome/go-testdeep/helpers/tdhttp?tab=doc"&gt;tdhttp helper package&lt;/a&gt; allows you to easily test your HTTP API using these operators.&lt;br&gt;
See the example of a simple JSON/XML HTTP API tested using go-testdeep and its tdhttp package under the Go Play Space: &lt;a href="https://goplay.space/#xrGKu2cNQFr"&gt;https://goplay.space/#xrGKu2cNQFr&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It reports colored error messages when something goes wrong, here used with another operator, &lt;a href="https://go-testdeep.zetta.rocks/operators/between/"&gt;Between&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dtiFiUg9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://go-testdeep.zetta.rocks/images/colored-output.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dtiFiUg9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://go-testdeep.zetta.rocks/images/colored-output.svg" alt="Example of error"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All the functions and methods are fully documented, each operator comes with its examples, and last but not least the &lt;a href="https://coveralls.io/github/maxatome/go-testdeep?branch=master"&gt;test code coverage is close to 100%&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Do not hesitate to comment, file an issue or a PR. I would be happy to help you or simply discuss.&lt;/p&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://go-testdeep.zetta.rocks/"&gt;home&lt;/a&gt; — &lt;a href="https://pkg.go.dev/github.com/maxatome/go-testdeep/td"&gt;godoc&lt;/a&gt;&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qF2jUiUG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/github-logo-6a5bca60a4ebf959a6df7f08217acd07ac2bc285164fae041eacb8a148b1bab9.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/maxatome"&gt;
        maxatome
      &lt;/a&gt; / &lt;a href="https://github.com/maxatome/go-testdeep"&gt;
        go-testdeep
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Extremely flexible golang deep comparison, extends the go testing package and tests HTTP APIs
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;h1&gt;
go-testdeep&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://travis-ci.org/maxatome/go-testdeep" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/ad5e7b8a4b8cd60c62debe5e7b5dd900699a874e/68747470733a2f2f7472617669732d63692e6f72672f6d617861746f6d652f676f2d74657374646565702e7376673f6272616e63683d6d6173746572" alt="Build Status"&gt;&lt;/a&gt;
&lt;a href="https://coveralls.io/github/maxatome/go-testdeep?branch=master" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/e85abf49ef521c91f0cae1271ad9e5db2d9e3346/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f6d617861746f6d652f676f2d74657374646565702f62616467652e7376673f6272616e63683d6d6173746572" alt="Coverage Status"&gt;&lt;/a&gt;
&lt;a href="https://goreportcard.com/report/github.com/maxatome/go-testdeep" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/8ffea08180e3e361f5295a564b9ca03e24d9fda4/68747470733a2f2f676f7265706f7274636172642e636f6d2f62616467652f6769746875622e636f6d2f6d617861746f6d652f676f2d7465737464656570" alt="Go Report Card"&gt;&lt;/a&gt;
&lt;a href="https://golangci.com/r/github.com/maxatome/go-testdeep" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/a2dc0b7707458a5cbe80b2505d6d54f3995599b4/68747470733a2f2f676f6c616e6763692e636f6d2f6261646765732f6769746875622e636f6d2f6d617861746f6d652f676f2d74657374646565702e737667" alt="GolangCI"&gt;&lt;/a&gt;
&lt;a href="https://pkg.go.dev/github.com/maxatome/go-testdeep/td" rel="nofollow"&gt;&lt;img src="https://camo.githubusercontent.com/7dead2dbc4408c214db6f6aaf600ed90fc732c36/68747470733a2f2f676f646f632e6f72672f6769746875622e636f6d2f6d617861746f6d652f676f2d74657374646565702f74643f7374617475732e737667" alt="GoDoc"&gt;&lt;/a&gt;
&lt;a href="https://github.com/maxatome/go-testdeep/releases"&gt;&lt;img src="https://camo.githubusercontent.com/9493a4b14d05968a60da896b42aa06af1326593b/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f6d617861746f6d652f676f2d74657374646565702e737667" alt="Version"&gt;&lt;/a&gt;
&lt;a href="https://github.com/avelino/awesome-go/#testing"&gt;&lt;img src="https://camo.githubusercontent.com/974d19bae442ae2c1657753f39651ade6bef3411/68747470733a2f2f617765736f6d652e72652f6d656e74696f6e65642d62616467652e737667" alt="Mentioned in Awesome Go"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://raw.githubusercontent.com/maxatome/go-testdeep/master/tools/docs_src/static/images/logo.png"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1M0BbzPh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://raw.githubusercontent.com/maxatome/go-testdeep/master/tools/docs_src/static/images/logo.png" alt="go-testdeep"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Extremely flexible golang deep comparison, extends the go testing package.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://raw.githubusercontent.com/maxatome/go-testdeep/master/#latest-news"&gt;Latest news&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://raw.githubusercontent.com/maxatome/go-testdeep/master/#synopsis"&gt;Synopsis&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://raw.githubusercontent.com/maxatome/go-testdeep/master/#description"&gt;Description&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://raw.githubusercontent.com/maxatome/go-testdeep/master/#installation"&gt;Installation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://go-testdeep.zetta.rocks/functions/" rel="nofollow"&gt;Functions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://go-testdeep.zetta.rocks/operators/" rel="nofollow"&gt;Available operators&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://raw.githubusercontent.com/maxatome/go-testdeep/master/#helpers"&gt;Helpers&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pkg.go.dev/github.com/maxatome/go-testdeep/helpers/tdhttp" rel="nofollow"&gt;&lt;code&gt;tdhttp&lt;/code&gt; or HTTP API testing helper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pkg.go.dev/github.com/maxatome/go-testdeep/helpers/tdutil" rel="nofollow"&gt;&lt;code&gt;tdutil&lt;/code&gt; aka the helper of helpers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://raw.githubusercontent.com/maxatome/go-testdeep/master/#see-also"&gt;See also&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://raw.githubusercontent.com/maxatome/go-testdeep/master/#license"&gt;License&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://go-testdeep.zetta.rocks/faq/" rel="nofollow"&gt;FAQ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
Latest news&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;2020/04/11
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://pkg.go.dev/github.com/maxatome/go-testdeep/helpers/tdhttp" rel="nofollow"&gt;&lt;code&gt;tdhttp&lt;/code&gt;&lt;/a&gt; helper (the HTTP API tester) enhanced and fully documented;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2020/04/06
&lt;ul&gt;
&lt;li&gt;new &lt;a href="https://go-testdeep.zetta.rocks/operators/delay/" rel="nofollow"&gt;&lt;code&gt;Delay&lt;/code&gt;&lt;/a&gt; operator;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2020/02/29
&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;github.com/maxatome/go-testdeep&lt;/code&gt; deprecated (but still usable),
use &lt;code&gt;github.com/maxatome/go-testdeep/td&lt;/code&gt; instead. See the
&lt;a href="https://go-testdeep.zetta.rocks/faq/#should-i-import-githubcommaxatomego-testdeep-or-githubcommaxatomego-testdeeptd" rel="nofollow"&gt;FAQ point&lt;/a&gt;
for details about migration;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2020/02/13:
&lt;ul&gt;
&lt;li&gt;new operator anchoring feature, see the &lt;a href="https://go-testdeep.zetta.rocks/faq/#how-does-operator-anchoring-work" rel="nofollow"&gt;corresponding FAQ
section&lt;/a&gt;
and the &lt;a href="https://go-testdeep.zetta.rocks/functions/td-t/#anchoring-methods-of-tdt" rel="nofollow"&gt;new anchoring methods&lt;/a&gt;;&lt;/li&gt;
&lt;li&gt;new &lt;a href="https://go-testdeep.zetta.rocks/operators/sstruct/" rel="nofollow"&gt;&lt;code&gt;SStruct&lt;/code&gt;&lt;/a&gt; operator (and its friends &lt;a href="https://go-testdeep.zetta.rocks/operators/sstruct/#cmpsstruct-shortcut" rel="nofollow"&gt;&lt;code&gt;CmpSStruct&lt;/code&gt;&lt;/a&gt; &amp;amp; &lt;a href="https://go-testdeep.zetta.rocks/operators/sstruct/#tsstruct-shortcut" rel="nofollow"&gt;&lt;code&gt;T.SStruct&lt;/code&gt;&lt;/a&gt;),&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;see &lt;a href="https://github.com/maxatome/go-testdeep/commits/master"&gt;commits history&lt;/a&gt;
for other/older changes.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
Synopsis&lt;/h2&gt;
&lt;p&gt;Make golang tests easy, from simplest usage:&lt;/p&gt;
&lt;div class="highlight highlight-source-go"&gt;&lt;pre&gt;&lt;span class="pl-k"&gt;import&lt;/span&gt; (
  &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;testing&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;

  &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;github.com/maxatome/go-testdeep/td&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;
)

&lt;span class="pl-k"&gt;func&lt;/span&gt; &lt;span class="pl-en"&gt;TestMyFunc&lt;/span&gt;(&lt;span class="pl-v"&gt;t&lt;/span&gt; *&lt;span class="pl-v"&gt;testing&lt;/span&gt;.&lt;span class="pl-v"&gt;T&lt;/span&gt;) {
  td.&lt;span class="pl-c1"&gt;Cmp&lt;/span&gt;(t, &lt;span class="pl-c1"&gt;MyFunc&lt;/span&gt;(), &amp;amp;Info{Name: &lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;Alice&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;, Age: &lt;span class="pl-c1"&gt;42&lt;/span&gt;})
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;To a bit more complex one, allowing…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/maxatome/go-testdeep"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



</description>
      <category>go</category>
      <category>testing</category>
      <category>framework</category>
    </item>
  </channel>
</rss>
