Testgetriebene Entwicklung nach der Münchner Schule

Seite 5: Listing

Inhaltsverzeichnis
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)