Skip to content

Commit 3ed99e7

Browse files
committed
Initial setup for writing alignments in output
1 parent 6d3e34a commit 3ed99e7

3 files changed

Lines changed: 126 additions & 10 deletions

File tree

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import { Alignment } from "../models/alignment";
2+
3+
export class AlignmentMarkerStrategy {
4+
5+
public marker(alignment: Alignment): IMarker {
6+
switch (alignment) {
7+
case Alignment.Left: return new LeftMarker();
8+
case Alignment.Right: return new RightMarker();
9+
case Alignment.Center: return new CenterMarker();
10+
default: return new NoOpMarker();
11+
}
12+
}
13+
}
14+
15+
export interface IMarker {
16+
mark(padding: string): string;
17+
}
18+
19+
export class NoOpMarker implements IMarker {
20+
public mark(padding: string): string {
21+
return padding;
22+
}
23+
}
24+
25+
export class LeftMarker implements IMarker {
26+
public mark(padding: string): string {
27+
return ":" + padding.substr(1);
28+
}
29+
}
30+
31+
export class RightMarker implements IMarker {
32+
public mark(padding: string): string {
33+
return padding.substring(0, padding.length - 1) + ":";
34+
}
35+
}
36+
37+
export class CenterMarker implements IMarker {
38+
public mark(padding: string): string {
39+
return ":" + padding.substring(1, padding.length - 1) + ":";
40+
}
41+
}

src/viewModelFactories/rowViewModelFactory.ts

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
import { RowViewModel } from "../viewModels/rowViewModel";
22
import { PadCalculator } from "../padCalculation/padCalculator";
33
import { Table } from "../models/table";
4+
import { Alignment } from "../models/alignment";
5+
import { AlignmentMarkerStrategy } from "./alignmentMarker";
46

57
export class RowViewModelFactory {
8+
69
constructor(
710
private _contentPadCalculator: PadCalculator,
811
private _separatorPadCalculator: PadCalculator)
@@ -24,11 +27,26 @@ export class RowViewModelFactory {
2427

2528
public buildSeparator(table: Table): RowViewModel {
2629
let resultRow = new Array(table.columnCount);
27-
for(let col = 0; col < table.columnCount; col++) {
28-
resultRow[col] =
30+
31+
//TODO: extract this as constructor param
32+
let alignmentMarkerSelector = new AlignmentMarkerStrategy();
33+
for(let col = 0; col < table.columnCount; col++)
34+
resultRow[col] = alignmentMarkerSelector.marker(table.alignments[col]).mark(
2935
this._separatorPadCalculator.getLeftPadding(table, 1, col) +
30-
this._separatorPadCalculator.getRightPadding(table, 0, col);
31-
}
36+
this._separatorPadCalculator.getRightPadding(table, 0, col)
37+
);
38+
3239
return new RowViewModel(resultRow);
3340
}
41+
/*
42+
private withAlignmentMarkers(padding: string, alignment: Alignment): string {
43+
if (alignment == Alignment.NotSet || padding == null)
44+
return padding;
45+
if (alignment == Alignment.Left)
46+
return ":" + padding.substr(1);
47+
if (alignment == Alignment.Right)
48+
return padding.substring(0, padding.length - 1) + ":";
49+
50+
return ":" + padding.substring(1, padding.length - 1) + ":";
51+
}*/
3452
}

test/unitTests/viewModelFactories/rowViewModelFactory.test.ts

Lines changed: 63 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@ suite("RowViewModelFactory.buildSeparator() tests", () => {
8282
const sut = createFactory(_contentPadCalculator.object, _separatorPadCalculator.object);
8383
const table = threeColumnTable();
8484

85+
_separatorPadCalculator.setup(_ => _.getLeftPadding(It.isAny(), It.isAny(), It.isAny())).returns(() => "");
86+
_separatorPadCalculator.setup(_ => _.getRightPadding(It.isAny(), It.isAny(), It.isAny())).returns(() => "");
87+
8588
const separatorRowViewModel = sut.buildSeparator(table);
8689

8790
_separatorPadCalculator.verify(_ => _.getLeftPadding(It.isAny(), It.isAny(), 0), Times.once());
@@ -96,6 +99,8 @@ suite("RowViewModelFactory.buildSeparator() tests", () => {
9699
test("Value returned from padCalculator.getLeftPadding is used to start the row value", () => {
97100
const sut = createFactory(_contentPadCalculator.object, _separatorPadCalculator.object);
98101
const table = threeColumnTable();
102+
103+
_separatorPadCalculator.setup(_ => _.getRightPadding(It.isAny(), It.isAny(), It.isAny())).returns(() => "");
99104
_separatorPadCalculator.setup(_ => _.getLeftPadding(It.isAny(), It.isAny(), 0)).returns(() => "test");
100105

101106
const separatorRowViewModel = sut.buildSeparator(table);
@@ -125,24 +130,76 @@ suite("RowViewModelFactory.buildSeparator() tests", () => {
125130
assertExt.isNotNull(separatorRowViewModel);
126131
assert.equal(separatorRowViewModel.getValueAt(1), "LeftRight");
127132
});
133+
134+
test("Not set alignment column separator does not contain :", () => {
135+
const sut = createFactory(_contentPadCalculator.object, _separatorPadCalculator.object);
136+
const table = threeColumnTable(Alignment.NotSet);
137+
138+
_separatorPadCalculator.setup(_ => _.getLeftPadding(It.isAny(), It.isAny(), It.isAny())).returns(() => "--");
139+
_separatorPadCalculator.setup(_ => _.getRightPadding(It.isAny(), It.isAny(), It.isAny())).returns(() => "--");
140+
141+
const separatorRowViewModel = sut.buildSeparator(table);
142+
143+
for (let col = 0; col < separatorRowViewModel.columnCount; col++)
144+
assert.equal(separatorRowViewModel.getValueAt(col), "----");
145+
});
146+
147+
test("Left aligned column separator starts with :", () => {
148+
const sut = createFactory(_contentPadCalculator.object, _separatorPadCalculator.object);
149+
const table = threeColumnTable(Alignment.Left);
150+
151+
_separatorPadCalculator.setup(_ => _.getLeftPadding(It.isAny(), It.isAny(), It.isAny())).returns(() => "--");
152+
_separatorPadCalculator.setup(_ => _.getRightPadding(It.isAny(), It.isAny(), It.isAny())).returns(() => "--");
153+
154+
const separatorRowViewModel = sut.buildSeparator(table);
155+
156+
for (let col = 0; col < separatorRowViewModel.columnCount; col++)
157+
assert.equal(separatorRowViewModel.getValueAt(col), ":---");
158+
});
159+
160+
test("Right aligned column separator ends with :", () => {
161+
const sut = createFactory(_contentPadCalculator.object, _separatorPadCalculator.object);
162+
const table = threeColumnTable(Alignment.Right);
163+
164+
_separatorPadCalculator.setup(_ => _.getLeftPadding(It.isAny(), It.isAny(), It.isAny())).returns(() => "--");
165+
_separatorPadCalculator.setup(_ => _.getRightPadding(It.isAny(), It.isAny(), It.isAny())).returns(() => "--");
166+
167+
const separatorRowViewModel = sut.buildSeparator(table);
168+
169+
for (let col = 0; col < separatorRowViewModel.columnCount; col++)
170+
assert.equal(separatorRowViewModel.getValueAt(col), "---:");
171+
});
172+
173+
test("Centrally aligned column separator starts and ends with :", () => {
174+
const sut = createFactory(_contentPadCalculator.object, _separatorPadCalculator.object);
175+
const table = threeColumnTable(Alignment.Center);
176+
177+
_separatorPadCalculator.setup(_ => _.getLeftPadding(It.isAny(), It.isAny(), It.isAny())).returns(() => "--");
178+
_separatorPadCalculator.setup(_ => _.getRightPadding(It.isAny(), It.isAny(), It.isAny())).returns(() => "--");
179+
180+
const separatorRowViewModel = sut.buildSeparator(table);
181+
182+
for (let col = 0; col < separatorRowViewModel.columnCount; col++)
183+
assert.equal(separatorRowViewModel.getValueAt(col), ":--:");
184+
});
128185
});
129186

130-
function threeColumnTable(): Table {
187+
function threeColumnTable(alignment: Alignment = Alignment.NotSet): Table {
131188
return tableFor([
132189
[ "aaaaa", "bbbbb", "ccccc" ],
133190
[ "aaaaa", "bbbbb", "ccccc" ]
134-
]);
191+
], alignment);
135192
}
136193

137-
function threeColumnTableWithEmptyMiddleColumn(): Table {
194+
function threeColumnTableWithEmptyMiddleColumn(alignment: Alignment = Alignment.NotSet): Table {
138195
return tableFor([
139196
[ "aaaaa", "", "ccccc" ],
140197
[ "aaaaa", "", "ccccc" ]
141-
]);
198+
], alignment);
142199
}
143200

144-
function tableFor(rows: string[][]) {
145-
const alignments: Alignment[] = rows[0].map(r => Alignment.Left);
201+
function tableFor(rows: string[][], alignment: Alignment) {
202+
const alignments: Alignment[] = rows[0].map(r => alignment);
146203
let table = new Table(rows.map(row => row.map(c => new Cell(c))), alignments);
147204
return table;
148205
}

0 commit comments

Comments
 (0)