DEV Community

Miguel Bernard
Miguel Bernard

Posted on • Originally published at blog.miguelbernard.com

2 1

First and Last line content | Solving the diamond kata with property-based testing

Solving the diamond kata with property-based testing series

  1. How to get started with Property-based Testing in C#
  2. Input generators in property-based tests with FsCheck
  3. First and Last line content
  4. Height equals Width
  5. Outside space symmetry
  6. Symmetry around the vertical axis
  7. Symmetry around the horizontal axis
  8. No padding for input letter row
  9. Letters order

All code samples are available on github


Intro

We continue our adventure trying to solve the Diamond Kata while using Property-Based testing. Last time, we added our first test, Non-empty and discovered how to use input generators. Now let's figure out the next test.

First and last line content

In the diamond Kata, the first and last line of every diamond always contains A. Such regularity is perfect for a property. Even the particular case with input A, where the first line is also the last one, respects that property.

e.g.

input: A

A
input: E

----A----
---B-B---
--C---C--
-D-----D-
E-------E
-D-----D-
--C---C--
---B-B---
----A----

C# Tests

[Property(Arbitrary = new[] { typeof(LetterGenerator) })]
public Property FirstLineContainsA(char c)
{
    return Diamond.Generate(c).First().Contains('A').ToProperty();
}

[Property(Arbitrary = new[] { typeof(LetterGenerator) })]
public Property LastLineContainsA(char c)
{
    return Diamond.Generate(c).Last().Contains('A').ToProperty();
}

Here we used some built-in methods of the .NET library, which makes these tests simple to read and short to write. It almost reads like a sentence.

  1. Diamond.Generate(c) Generates the diamond
  2. First() / Last() Takes the first/last line of the generated diamond
  3. Contains('A') Checks if the line contains the letter A and returns a bool
  4. ToProperty() Transforms a boolean expression to a property

If you are wondering what's [Property(Arbitrary = new[] { typeof(LetterGenerator) })] it's probably because you missed my previous post

Wrapping up

We are making some good progress towards a fully functioning test suite. However, there are still some uncovered areas that we'll address with more tests next time.


Solving the diamond kata with property-based testing series

  1. How to get started with Property-based Testing in C#
  2. Input generators in property-based tests with FsCheck
  3. First and Last line content
  4. Height equals Width
  5. Outside space symmetry
  6. Symmetry around the vertical axis
  7. Symmetry around the horizontal axis
  8. No padding for input letter row
  9. Letters order

All code samples are available on github

Reinvent your career. Join DEV.

It takes one minute and is worth it for your career.

Get started

Top comments (0)

👋 Kindness is contagious

Explore a sea of insights with this enlightening post, highly esteemed within the nurturing DEV Community. Coders of all stripes are invited to participate and contribute to our shared knowledge.

Expressing gratitude with a simple "thank you" can make a big impact. Leave your thanks in the comments!

On DEV, exchanging ideas smooths our way and strengthens our community bonds. Found this useful? A quick note of thanks to the author can mean a lot.

Okay