UNPKG

@tvkitchen/countertop

Version:

The entry point for developers who want to set up a TV Kitchen.

323 lines (310 loc) 9.73 kB
import { by } from '..' import { CountertopStation, CountertopStream, } from '../../../classes' import { generateMockAppliance, normalizeTributaryMaps, } from '../jest' import { getSourceStations, getLongestStreamLength, getCollectiveOutputTypes, getStationsThatConsumeTypes, getStreamsThatProduceTypes, filterStreamsContainingStation, getStreamOutputMap, getSourcesFromStreams, getStreamsFromStreamMap, getSourcesFromStreamMap, generateTributaryMaps, } from '../countertop' describe('countertop', () => { describe('getSourceStations', () => { it('Should extract stations that have no inputs', () => { const stationA = new CountertopStation(generateMockAppliance({ inputTypes: [], outputTypes: ['foo'], })) const stationB = new CountertopStation(generateMockAppliance({ inputTypes: ['foo'], outputTypes: ['bar'], })) const stations = [ stationA, stationB, ] const sourceStations = getSourceStations(stations) expect(sourceStations).toEqual([stationA]) }) }) describe('getLongestStreamLength', () => { it('should return the length of the longest stream', () => { const stationA = new CountertopStation(generateMockAppliance({ inputTypes: [], outputTypes: ['foo'], })) const stationB = new CountertopStation(generateMockAppliance({ inputTypes: ['foo'], outputTypes: ['bar'], })) const streamA = new CountertopStream(stationA) const streamB = new CountertopStream(stationB, new Map([['foo', streamA]])) const streams = [ streamA, streamB, ] expect(getLongestStreamLength(streams)).toBe(2) }) }) describe('getCollectiveOutputTypes', () => { it('should return the output types of multiple streams', () => { const stationA = new CountertopStation(generateMockAppliance({ inputTypes: [], outputTypes: ['foo'], })) const stationB = new CountertopStation(generateMockAppliance({ inputTypes: ['foo'], outputTypes: ['bar', 'baz'], })) const streamA = new CountertopStream(stationA) const streamB = new CountertopStream(stationB, new Map([['foo', streamA]])) const streams = [ streamA, streamB, ] const collectiveOutputTypes = getCollectiveOutputTypes(streams) expect(collectiveOutputTypes.sort()).toEqual( ['foo', 'bar', 'baz'].sort(), ) }) }) describe('getStationsThatConsumeTypes', () => { it('should return the stations that consume the specified types', () => { const stationA = new CountertopStation(generateMockAppliance({ inputTypes: ['red'], outputTypes: ['foo'], })) const stationB = new CountertopStation(generateMockAppliance({ inputTypes: ['foo'], outputTypes: ['bar', 'baz'], })) const stations = [ stationA, stationB, ] const result = getStationsThatConsumeTypes(stations, ['foo']) expect(result).toEqual([stationB]) }) }) describe('getStreamsThatProduceTypes', () => { it('should return the streams that produce the specified types', () => { const stationA = new CountertopStation(generateMockAppliance({ inputTypes: [], outputTypes: ['foo'], })) const stationB = new CountertopStation(generateMockAppliance({ inputTypes: ['foo'], outputTypes: ['bar', 'baz'], })) const streamA = new CountertopStream(stationA) const streamB = new CountertopStream(stationB, new Map([['foo', streamA]])) const streamC = new CountertopStream(stationA) const streams = [ streamA, streamB, streamC, ] const result = getStreamsThatProduceTypes(streams, ['foo']) expect(result.sort(by('id'))).toEqual([streamA, streamC].sort(by('id'))) }) }) describe('filterStreamsContainingStation', () => { it('should remove streams that contain a given station', () => { const stationA = new CountertopStation(generateMockAppliance({ inputTypes: [], outputTypes: ['foo'], })) const stationB = new CountertopStation(generateMockAppliance({ inputTypes: ['foo'], outputTypes: ['bar', 'baz'], })) const stationC = new CountertopStation(generateMockAppliance({ inputTypes: [], outputTypes: ['bloo'], })) const streamA = new CountertopStream(stationA) const streamB = new CountertopStream(stationB, new Map([['foo', streamA]])) const streamC = new CountertopStream(stationC) const streams = [ streamA, streamB, streamC, ] const result = filterStreamsContainingStation(streams, stationA) expect(result).toEqual([streamC]) }) }) describe('getStreamOutputMap', () => { it('should map streams by their output types', () => { const stationA = new CountertopStation(generateMockAppliance({ inputTypes: [], outputTypes: ['foo'], })) const stationB = new CountertopStation(generateMockAppliance({ inputTypes: ['foo'], outputTypes: ['bar', 'baz'], })) const streamA = new CountertopStream(stationA) const streamB = new CountertopStream(stationB, new Map([['foo', streamA]])) const streams = [ streamA, streamB, ] const result = getStreamOutputMap(streams) expect(result).toEqual(new Map([ ['foo', [streamA]], ['bar', [streamB]], ['baz', [streamB]], ])) }) }) describe('getSourcesFromStreams', () => { it('should return all sources represented by streams', () => { const stationA = new CountertopStation(generateMockAppliance({ inputTypes: [], outputTypes: ['foo'], })) const stationB = new CountertopStation(generateMockAppliance({ inputTypes: ['foo'], outputTypes: ['bar', 'baz'], })) const stationC = new CountertopStation(generateMockAppliance({ inputTypes: [], outputTypes: ['foo'], })) const streamA = new CountertopStream(stationA) const streamB = new CountertopStream(stationB, new Map([['foo', streamA]])) const streamC = new CountertopStream(stationC) const streams = [ streamB, streamC, ] const result = getSourcesFromStreams(streams) expect(result.sort(by('id'))).toEqual([stationA, stationC].sort(by('id'))) }) }) describe('getStreamsFromStreamMap', () => { it('should return the streams represented in a stream map', () => { const stationA = new CountertopStation(generateMockAppliance({ inputTypes: [], outputTypes: ['foo'], })) const stationB = new CountertopStation(generateMockAppliance({ inputTypes: ['foo'], outputTypes: ['bar', 'baz'], })) const stationC = new CountertopStation(generateMockAppliance({ inputTypes: [], outputTypes: ['foo'], })) const streamA = new CountertopStream(stationA) const streamB = new CountertopStream(stationB, new Map([['foo', streamA]])) const streamC = new CountertopStream(stationC) const streamMap = new Map([ ['foo', [streamA, streamC]], ['bar', [streamB]], ['baz', [streamB]], ]) const result = getStreamsFromStreamMap(streamMap) expect(result.sort(by('id'))).toEqual( [streamA, streamB, streamC].sort(by('id')), ) }) }) describe('getSourcesFromStreamMap', () => { it('should return the set of sources represented in a stream map', () => { const stationA = new CountertopStation(generateMockAppliance({ inputTypes: [], outputTypes: ['foo'], })) const stationB = new CountertopStation(generateMockAppliance({ inputTypes: ['foo'], outputTypes: ['bar', 'baz'], })) const stationC = new CountertopStation(generateMockAppliance({ inputTypes: [], outputTypes: ['foo'], })) const streamA = new CountertopStream(stationA) const streamB = new CountertopStream(stationB, new Map([['foo', streamA]])) const streamC = new CountertopStream(stationC) const streamMap = new Map([ ['foo', [streamA, streamC]], ['bar', [streamB]], ['baz', [streamB]], ]) const result = getSourcesFromStreamMap(streamMap) expect(result.sort(by('id'))).toEqual( [stationA, stationC].sort(by('id')), ) }) }) describe('generateTributaryMaps', () => { it('should not create tributary maps of streams with different sources', () => { const stationA = new CountertopStation(generateMockAppliance({ inputTypes: [], outputTypes: ['foo'], })) const stationB = new CountertopStation(generateMockAppliance({ inputTypes: ['foo'], outputTypes: ['bar', 'baz'], })) const stationC = new CountertopStation(generateMockAppliance({ inputTypes: [], outputTypes: ['foo'], })) const stationD = new CountertopStation(generateMockAppliance({ inputTypes: ['foo', 'bar'], outputTypes: ['baz'], })) const stations = [ stationA, stationB, stationC, stationD, ] const streamA = new CountertopStream(stationA) const streamB = new CountertopStream(stationB, new Map([['foo', streamA]])) const streamC = new CountertopStream(stationC) const streamMap = new Map([ ['foo', [streamA, streamC]], ['bar', [streamB]], ['baz', [streamB]], ]) const result = generateTributaryMaps(stationD, streamMap) expect(normalizeTributaryMaps(result, stations)).toMatchSnapshot() }) it('should return a partially populated tributary map if there are not enough outputs for all inputs', () => { const stationA = new CountertopStation(generateMockAppliance({ inputTypes: [], outputTypes: ['foo'], })) const stationB = new CountertopStation(generateMockAppliance({ inputTypes: ['foo', 'bar'], outputTypes: ['baz'], })) const stations = [ stationA, stationB, ] const streamA = new CountertopStream(stationA) const streamMap = new Map([ ['foo', [streamA]], ]) const result = generateTributaryMaps(stationB, streamMap) expect(normalizeTributaryMaps(result, stations)).toMatchSnapshot() }) }) })