1. 仕様

  • 3で割り切れる場合は「Fizz」を出力する。

  • 5で割り切れる場合は「Buzz」を出力する。

  • 両者で割り切れる場合は「FizzBuzz」を出力する。

  • 上記以外の場合は与えられた数字を出力する。

  • 指定された回数だけ繰り返し実行する。

2. 設計

2.1. TODOリスト

  • ✓ 「Fizz」を出力できるようにする

  • ✓ 「Buzz」を出力できるようにする

  • ✓ 「FizzBuzz」を出力できるようにする

  • ✓ 繰り返し実行できるようにする

2.2. ユースケース図

diag 18b116208c0839035ae385fac67dfa1d

2.3. クラス図

diag 6bc15dc2d9a8beb57b2469954d29e874

2.4. シーケンス図

diag e2bdd93f913bf7a0a2eaed7cfb34a788

3. 実装

3.1. テストコード

/* eslint-disable import/no-extraneous-dependencies */
const chai = require('chai');
const FizzBuzz = require('../../src/fizz_buzz');

const { expect } = chai;

describe('Tests FizzBuzz', () => {
  it('3ならばFizzを返す', () => {
    expect(FizzBuzz.generate(3)).to.equal('Fizz');
  });

  it('6ならばFizzを返す', () => {
    expect(FizzBuzz.generate(6)).to.equal('Fizz');
  });

  it('5ならばBuzzを返す', () => {
    expect(FizzBuzz.generate(5)).to.equal('Buzz');
  });

  it('10ならばBuzzを返す', () => {
    expect(FizzBuzz.generate(10)).to.equal('Buzz');
  });

  it('50ならばBuzzを返す', () => {
    expect(FizzBuzz.generate(50)).to.equal('Buzz');
  });

  it('15ならばFizzBuzzを返す', () => {
    expect(FizzBuzz.generate(15)).to.equal('FizzBuzz');
  });

  it('30ならばFizzBuzzを返す', () => {
    expect(FizzBuzz.generate(30)).to.equal('FizzBuzz');
  });

  it('1ならば1を返す', () => {
    expect(FizzBuzz.generate(1)).to.equal(1);
  });

  it('101ならば101を返す', () => {
    expect(FizzBuzz.generate(101)).to.equal(101);
  });

  it("5ならば[1, 2, 'Fizz', 4, 'Buzz']を返す", () => {
    expect(FizzBuzz.iterate(5)).to.eql([1, 2, 'Fizz', 4, 'Buzz']);
  });
});
/* eslint-disable import/no-extraneous-dependencies */

const chai = require('chai');
const app = require('../../app.js');

const { expect } = chai;

describe('Tests FizzBuzzFunction', () => {
  let event;

  beforeEach(() => {
    event = {
      body: '{}',
    };
  });

  it('3ならばFizzを返す', async () => {
    event = {
      queryStringParameters: { number: '3' },
    };
    const result = await app.generate(event);

    expect(result).to.be.an('object');
    expect(result.statusCode).to.equal(200);
    expect(result.body).to.be.an('string');
    expect(result.body).to.equal('Fizz');
  });

  it("5ならば[1, 2, 'Fizz', 4, 'Buzz']を返す", async () => {
    event = {
      body: '{"count": "5"}',
    };
    const result = await app.iterate(event);

    expect(result).to.be.an('object');
    expect(result.statusCode).to.equal(200);
    expect(result.body).to.be.an('array');
    expect(result.body).to.eql([1, 2, 'Fizz', 4, 'Buzz']);
  });
});

3.2. プロダクトコード

module.exports = class FizzBuzz {
  static generate(number) {
    let value = number;
    if (number % 3 === 0 && number % 5 === 0) {
      value = 'FizzBuzz';
    } else if (number % 3 === 0) {
      value = 'Fizz';
    } else if (number % 5 === 0) {
      value = 'Buzz';
    }
    return value;
  }

  static iterate(count) {
    const array = [];
    for (let i = 0; i < count; i += 1) {
      array.push(FizzBuzz.generate(i + 1));
    }
    return array;
  }
};
/* eslint-disable no-console,max-len,prefer-destructuring */

const FizzBuzz = require('./src/fizz_buzz');

const createResponse = (statusCode, body) => ({
  statusCode,
  body,
  headers: {
    'Content-Type': 'application/json',
    'Access-Control-Allow-Origin': '*',
  },
});

exports.generate = async (event) => {
  let number;
  let data;
  if (event.queryStringParameters !== null && event.queryStringParameters !== undefined) {
    if (event.queryStringParameters.number !== null && event.queryStringParameters.number !== undefined) {
      number = event.queryStringParameters.number;
    }
  }

  try {
    data = FizzBuzz.generate(number);
  } catch (err) {
    console.log(`Application error occurred: ${err}`);
    return createResponse(500, err);
  }

  console.log(`Application execute with params: ${number}`);
  return createResponse(200, data);
};

exports.iterate = async (event) => {
  const params = {
    Item: JSON.parse(event.body),
  };
  let data;

  try {
    data = FizzBuzz.iterate(params.Item.count);
  } catch (err) {
    console.log(`Application error occurred: ${err}`);
    return createResponse(500, err);
  }

  console.log(`Application execute with params: ${JSON.stringify(params.Item)}`);
  return createResponse(200, data);
};

4. 参照