Advent of PBT 2021 - Day 19
Tags: challenge, testing, webdev, javascript
Published: 2021-12-19 11:13:32

---
title: Advent of PBT 2021 - Day 19
published: true
description: Advent of Property Based Testing - Day 19
tags: challenge,testing,webdev,javascript
//cover_image: https://direct_url_to_image.jpg
---

> _Advent of PBT 2021 — Learn how to use property based testing and [fast-check](https://github.com/dubzzz/fast-check) through examples_

Our algorithm today is: **metroRoute**.
It comes with the following documentation and prototype:
```ts
export type Track = { from: number; to: number; length: number };

/**
 * Given a map of all the tracks connecting stations of a metro,
 * we want to compute the shortest path (in terms of distance) to
 * reach the destination.
 *
 * @param departure - Id of the station used as departure
 *                    (must be an integer value)
 * @param destination - Id of the station used as destination
 *                      (must be an integer value)
 * @param tracks - List of all the connections between stations
 *                 of the map
 *
 * @returns
 * The list of tracks to take to go from departure to destination and
 * resulting into the shortest path (if there is one).
 * If there is no path going to the destination, then it returns
 * undefined.
 */
declare function metroRoute(
  departure: number,
  destination: number,
  tracks: Track[]
): Track[] | undefined;
```

We already wrote some examples based tests for it:
```ts
it("should find the only route leading from 1 to 5", () => {
  // Arrange
  const tracks: Track[] = [
    { from: 1, to: 2, length: 2 },
    { from: 2, to: 3, length: 3 },
    { from: 3, to: 4, length: 8 },
    { from: 4, to: 5, length: 1 }
  ];

  // Act
  const route = metroRoute(1, 5, tracks);

  // Assert
  expect(route).toEqual([tracks[0], tracks[1], tracks[2], tracks[3]]);
});

it("should find the shortest route leading from 1 to 5", () => {
  // Arrange
  const tracks: Track[] = [
    { from: 1, to: 2, length: 2 },
    { from: 2, to: 3, length: 3 },
    { from: 3, to: 4, length: 8 },
    { from: 4, to: 5, length: 1 },
    { from: 1, to: 5, length: 100 },
    { from: 3, to: 4, length: 1 }
  ];

  // Act
  const route = metroRoute(1, 5, tracks);

  // Assert
  expect(route).toEqual([tracks[0], tracks[1], tracks[5], tracks[3]]);
});

it("should not consider going backward on the route from 1 to 5", () => {
  // Arrange
  const tracks: Track[] = [
    { from: 1, to: 2, length: 2 },
    { from: 2, to: 3, length: 3 },
    { from: 3, to: 4, length: 8 },
    { from: 4, to: 5, length: 1 }
  ];

  // Act
  const route = metroRoute(5, 1, tracks);

  // Assert
  expect(route).toBe(undefined);
});
```

How would you cover it with Property Based Tests?

In order to ease your task we provide you with an already setup CodeSandbox, with examples based tests already written and a possible implementation of the algorithm: https://codesandbox.io/s/advent-of-pbt-day-19-nwpzp?file=/src/index.spec.ts&previewwindow=tests

You wanna see the solution? Here is the set of properties I came with to cover today's algorithm: https://dev.to/dubzzz/advent-of-pbt-2021-day-19-solution-e57

---

[Back to "Advent of PBT 2021"](https://dev.to/dubzzz/advent-of-pbt-2021-13ee) to see topics covered during the other days and their solutions.

More about this serie on [@ndubien](https://twitter.com/ndubien) or with the hashtag [#AdventOfPBT](https://twitter.com/search?q=%23AdventOfPBT).