Skip to content

Instantly share code, notes, and snippets.

@webpapaya
Created January 16, 2021 14:01
Show Gist options
  • Save webpapaya/b91c3440de168ef726f2a235d24d53dc to your computer and use it in GitHub Desktop.
Save webpapaya/b91c3440de168ef726f2a235d24d53dc to your computer and use it in GitHub Desktop.
Start of diamond heart kata using property based testing (Code Retreat 2021-01-16)
import {
allOf,
assertThat,
describe,
equalTo,
everyItem,
greaterThanOrEqualTo,
hasProperty, hasSize,
lessThanOrEqualTo
} from 'hamjest';
// Input: C -> 3 * 2 - 1
// A
// B B
// C C
// B B
// A
// Input: B
// A
// B B
// A
// Input: A
// A
function getOrdinal(char: string) {
return char.charCodeAt(0) - 'A'.charCodeAt(0) + 1;
}
const CHARACTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
function randomChar() {
return CHARACTERS[Math.floor(CHARACTERS.length * Math.random())]
}
function diamondSideLength(char: string) {
return getOrdinal(char) * 2 - 1;
}
function getLines(string: String) {
return string.split('\n')
}
function createDiamondForCharacter(char: string) {
let strings = []
let sideLength = diamondSideLength(char);
for(let i = 0; i < sideLength; i++) {
strings.push(Array(sideLength).join(' ') + 'U')
}
return strings.join('\n')
}
function testPropertiesOf(char:string) {
it(`height of diamond ${char} is related on character`, () => {
const diamond = createDiamondForCharacter(char)
assertThat(getLines(diamond).length, equalTo(diamondSideLength(char)))
})
it(`width of diamond ${char} is related to character`, () => {
const diamond = createDiamondForCharacter(char)
assertThat(getLines(diamond),
everyItem(hasSize(diamondSideLength(char))))
})
it('corner character only exists once', () => {
const diamond = createDiamondForCharacter(char)
const lines = getLines(diamond);
assertThat(lines[0].trim(), hasSize(1))
assertThat(lines[lines.length - 1].trim(), hasSize(1))
})
}
for (let i = 0; i < 100; i++) {
testPropertiesOf(randomChar())
}
it('getOrdinal A', () => {
assertThat(getOrdinal('A'), equalTo(1))
})
it('getOrdinal B', () => {
assertThat(getOrdinal('B'), equalTo(2))
})
it('randomChar returns latin character', () => {
for (let i = 0; i < 1000; i++) {
assertThat(getOrdinal(randomChar()), allOf(
greaterThanOrEqualTo(getOrdinal('A')),
lessThanOrEqualTo(getOrdinal('Z'))
))
}
})
it('randomChar returns distinct characters', () => {
const chars: Record<string, boolean> = {}
for (let i = 0; i < 1000; i++) {
chars[randomChar()] = true
}
assertThat(Object.keys(chars), hasProperty('length', greaterThanOrEqualTo(26)))
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment