Our algorithm was: reversed.
Go to the subject itself for more details
CodeSandbox with a possible set of properties you may have come with: https://codesandbox.io/s/advent-of-pbt-day-16-solution-bywoo?file=/src/index.spec.ts&previewwindow=tests
Property 1: should produce an array having the same length
for any array
it should reverse it to an array having the same length
Written with fast-check:
it("should produce an array having the same length", () => {
fc.assert(
fc.property(fc.array(fc.anything()), (data) => {
// Arrange / Act
const rev = reversed(data);
// Assert
expect(rev).toHaveLength(data.length);
})
);
});
Property 2: should reverse any array
While this property is definitely the one we would like to define, I tend not to like it as it somehow rewrites the implementation with the same risk of offset by 1. I'd rather go for property 3 to assess that characteristic.
for any array
it should reverse it
Written with fast-check:
it("should reverse any array", () => {
fc.assert(
fc.property(fc.array(fc.anything()), (data) => {
// Arrange / Act
const rev = reversed(data);
// Assert
for (let index = 0; index !== data.length; ++index) {
expect(rev[rev.length - index - 1]).toBe(data[index]);
}
})
);
});
Property 3: should properly reverse concatenated arrays: rev concat(a,b) = concat(rev b, rev a)
This property is rather mathematics but at the end it fulfill the exact same mission as property number 2: checking that the computed array is well reversed. But instead of focusing on each items it focuses on chunks of the array.
for any arrays a and b
we should have: rev concat(a,b) = concat(rev b, rev a)
Written with fast-check:
it("should properly reverse concatenated arrays: rev concat(a,b) = concat(rev b, rev a)", () => {
fc.assert(
fc.property(fc.array(fc.anything()), fc.array(fc.anything()), (a, b) => {
// Arrange / Act
const rev = reversed([...a, ...b]);
const revA = reversed(a);
const revB = reversed(b);
// Assert
expect(rev).toEqual([...revB, ...revA]);
})
);
});
Property 4: should go back to the original array if reversed twice
for any arrays a and b
we should have: rev concat(a,b) = concat(rev b, rev a)
Written with fast-check:
it("should go back to the original array if reversed twice", () => {
fc.assert(
fc.property(fc.array(fc.anything()), (data) => {
// Arrange / Act / Assert
expect(reversed(reversed(data))).toEqual(data);
})
);
});
Back to "Advent of PBT 2021" to see topics covered during the other days and their solutions.
More about this serie on @ndubien or with the hashtag #AdventOfPBT.
Top comments (0)