JiriChara/bavaria-ipsum

View on GitHub
test/bavaria-ipsum.spec.js

Summary

Maintainability
B
5 hrs
Test Coverage
'use strict';

describe('BavariaIpsum', function () {
    beforeEach(function () {
        this.BavariaIpsum = require('../src/bavaria-ipsum');
    });

    describe('constructor', function () {
        describe('no options given', function () {
            beforeEach(function () {
                this.bavariaIpsum = new this.BavariaIpsum();
            });

            it('initializes source to array of words', function () {
                expect(this.bavariaIpsum.source).toBeArrayOfStrings();
            });

            it('initializes startSentence', function () {
                expect(this.bavariaIpsum.startSentence).toBe(
                    'Bavaria ipsum dolor sit amet'
                );
            });

            it('initializes minSentenceWords', function () {
                expect(this.bavariaIpsum.minSentenceWords).toBe(2);
            });

            it('initializes maxSentenceWords', function () {
                expect(this.bavariaIpsum.maxSentenceWords).toBe(20);
            });

            it('initializes showCommaChance', function () {
                expect(this.bavariaIpsum.showCommaChance).toBe(0.1);
            });

            it('initializes minParagraphSentences', function () {
                expect(this.bavariaIpsum.minParagraphSentences).toBe(2);
            });

            it('initializes minParagraphSentences', function () {
                expect(this.bavariaIpsum.maxParagraphSentences).toBe(20);
            });
        });

        describe('options given', function () {
            beforeEach(function () {
                this.bavariaIpsum = new this.BavariaIpsum({
                    startSentence: 'foo',
                    minSentenceWords: 1,
                    maxSentenceWords: 2,
                    showCommaChance: 0.01,
                    minParagraphSentences: 3,
                    maxParagraphSentences: 4
                });
            });

            it('initializes startSentence', function () {
                expect(this.bavariaIpsum.startSentence).toBe(
                    'foo'
                );
            });

            it('initializes minSentenceWords', function () {
                expect(this.bavariaIpsum.minSentenceWords).toBe(1);
            });

            it('initializes maxSentenceWords', function () {
                expect(this.bavariaIpsum.maxSentenceWords).toBe(2);
            });

            it('initializes showCommaChance', function () {
                expect(this.bavariaIpsum.showCommaChance).toBe(0.01);
            });

            it('initializes minParagraphSentences', function () {
                expect(this.bavariaIpsum.minParagraphSentences).toBe(3);
            });

            it('initializes minParagraphSentences', function () {
                expect(this.bavariaIpsum.maxParagraphSentences).toBe(4);
            });
        });
    });

    describe('instance methods', function () {
        beforeEach(function () {
            this.bavariaIpsum = new this.BavariaIpsum();
        });

        describe('generateWord', function () {
            it('returns random word from source array', function () {
                spyOn(this.bavariaIpsum, '_getRandomInt').and.returnValue(10);

                expect(this.bavariaIpsum.generateWord()).toBe(
                    this.bavariaIpsum.source[10]
                );

                expect(this.bavariaIpsum._getRandomInt).toHaveBeenCalledWith(
                    0,
                    this.bavariaIpsum.source.length - 1
                );
            });
        });

        describe('generateSentence', function () {
            it('generates sentence', function () {
                expect(this.bavariaIpsum.generateSentence()).toBeString();
            });

            it('generates sentence of given length', function () {
                var i = 500;

                while (i-- > 0) {
                    expect(this.bavariaIpsum.generateSentence(1)).toMatch(
                        /^.+[.?!]$/i
                    );

                    expect(this.bavariaIpsum.generateSentence(2)).toMatch(
                        /^.+(\s|,)+.+[.?!]$/i
                    );
                }
            });

            it('starts with capitalized letter', function () {
                var i = 500,
                    firstLetter;

                while (i-- > 0) {
                    firstLetter = this.bavariaIpsum.generateSentence()[0];
                    expect(firstLetter).toEqual(
                        firstLetter.toUpperCase()
                    );
                }
            });

            it('ends with ? . or !', function () {
                var i = 500,
                    sentence,
                lastLetter;

                while (i-- > 0) {
                    sentence = this.bavariaIpsum.generateSentence();
                    lastLetter = sentence[sentence.length - 1];

                    expect(lastLetter).toMatch(
                        /^[?.!]$/
                    );
                }
            });

            it('adds comma', function () {
                this.bavariaIpsum.showCommaChance = 1; // 100%

                var i = 500;

                while (i-- > 0) {
                    expect(this.bavariaIpsum.generateSentence(2)).toMatch(
                        /^.+,\s.+[.?!]$/i
                    );

                    expect(
                        this.bavariaIpsum.generateSentence(2).indexOf(',') > 0
                    ).toBe(true);
                }
            });
        });

        describe('generateParagraph', function () {
            it('returns string', function () {
                expect(this.bavariaIpsum.generateParagraph()).toBeString();
            });

            it('generates given count of sentences', function () {
                var i = 500;

                while (i-- > 0) {
                    expect(this.bavariaIpsum.generateParagraph(1)).toMatch(
                        /^.+[.?!]$/
                    );

                    expect(this.bavariaIpsum.generateParagraph(2)).toMatch(
                        /^.+[.?!]\s.+[.?!]$/
                    );
                }
            });

            it('starts with startingSentence if option given', function () {
                var i = 500;

                while (i-- > 0) {
                    expect(this.bavariaIpsum.generateParagraph({
                        useStartingSentence: true
                    }).indexOf(this.bavariaIpsum.startSentence))
                        .toEqual(0);
                }
            });

            it('throws an error when length is invalid', function () {
                var self = this;

                expect(function () {
                    self.bavariaIpsum.generateParagraph('foo');
                }).toThrowError('Length must be an Integer');

                expect(function () {
                    self.bavariaIpsum.generateParagraph(5.5);
                }).toThrowError('Length must be an Integer');
            });

            it('throws an error when opts is invalid', function () {
                var self = this;

                expect(function () {
                    self.bavariaIpsum.generateParagraph(1, 1);
                }).toThrowError('Opts must be an Object');
            });
        });
    });
});