Testgetriebene Entwicklung nach der Münchner Schule
Seite 5: Listing
Listing 1
const ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const letterNumber = (letter) => ALPHABET.indexOf(letter);
const spaces = (n) => ".".repeat(n);
const reverseString = (str) => str.split("").reverse().join("");
const diamondWith = (letter) =>
/*one middle space*/ 1 + letterNumber(letter) *
/*left and right*/ 2;
const numberOfMiddleSpaces = (letter) =>
diamondWith(letter) - /* two letters on the borders*/ 2;
const numberOfOuterSpaces = ({ lineLetter, diamondLetter }) =>
(diamondWith(diamondLetter) -
numberOfMiddleSpaces(lineLetter) -
/*two letters*/ 2) /
2;
const peak = (letter) =>
spaces(letterNumber(letter)) + "A" +
spaces(letterNumber(letter));
const leftPartOfLine = ({ lineLetter, diamondLetter }) =>
spaces(numberOfOuterSpaces({ lineLetter, diamondLetter }))
+ lineLetter;
const rightPartOfLine = (lineData) =>
reverseString(leftPartOfLine(lineData));
const middlePartOfLine = (lineLetter) =>
spaces(numberOfMiddleSpaces(lineLetter));
const line = ({ lineLetter, diamondLetter }) =>
leftPartOfLine({ lineLetter, diamondLetter }) +
middlePartOfLine(lineLetter) +
rightPartOfLine({ lineLetter, diamondLetter });
const upperDiamond = (diamondLetter) => [
peak(diamondLetter),
...ALPHABET.slice(1, letterNumber(diamondLetter))
.split("")
.map((lineLetter) => line({ lineLetter, diamondLetter })),
];
const lowerDiamond = (letter) => upperDiamond(letter).reverse();
const diamond = (letter) =>
upperDiamond(letter)
.concat(line({ lineLetter: letter, diamondLetter: letter }))
.concat(lowerDiamond(letter))
.join("\n");
describe("inBetweenLine", () => {
it("should return .B.B. for Line for B for the C-Diamond",
() => {
expect(line({ lineLetter: "B",
diamondLetter: "C" })).toEqual(".B.B.");
});
it("should return a middle Line for a letter", () => {
expect(line({ lineLetter: "C",
diamondLetter: "C" })).toEqual("C...C");
});
});
describe('peakFor("C")', () => {
it("should return ..A.. for the C-Diamond", () => {
expect(peak("C")).toEqual("..A..");
});
});
describe("numberOfLetterInAlphabet", () => {
it("should return 2 for Letter 'C' - since A:0, B:1, C:2, ...",
() => {
expect(letterNumber("C")).toEqual(2);
});
it("should return 3 for Letter 'D' - since A:0, B:1, C:2, ...",
() => {
expect(letterNumber("D")).toEqual(3);
});
});
describe("numberOfMiddleSpaces", () => {
it("should return 1 space for a B-Diamond", () => {
expect(numberOfMiddleSpaces("B")).toEqual(1);
});
it("should return 3 spaces for a C-Diamond", () => {
expect(numberOfMiddleSpaces("C")).toEqual(3);
});
it("should return 5 spaces for a C-Diamond", () => {
expect(numberOfMiddleSpaces("D")).toEqual(5);
});
});
describe("spaces", () => {
it("should return a given number of spaces", () => {
expect(spaces(3)).toEqual("...");
});
});
describe("Diamond", () => {
it("should return the whole diamond", () => {
expect(diamond("C")).toEqual(
"..A..\n" + ".B.B.\n" + "C...C\n" + ".B.B.\n" + "..A.."
);
});
});
(rme)