add tests

Co-authored-by: R Midhun Suresh <MidhunSureshR@users.noreply.github.com>
This commit is contained in:
Bruno Windels 2022-11-25 14:42:24 +01:00
parent 7c6d651b32
commit b5d5adaa36
3 changed files with 185 additions and 2 deletions

View File

@ -59,7 +59,6 @@ export class TilesCollection extends BaseObservableList {
if (!currentTile || !currentTile.tryIncludeEntry(entry)) {
currentTile = this._createTile(entry);
if (currentTile) {
console.log("adding initial tile", currentTile.shape, currentTile.eventId, "at", this._tiles.length);
this._tiles.push(currentTile);
}
}
@ -142,7 +141,6 @@ export class TilesCollection extends BaseObservableList {
const newTile = this._createTile(entry);
if (newTile) {
console.log("adding tile", newTile.shape, newTile.eventId, "at", tileIdx);
this._addTileAt(tileIdx, newTile);
this._evaluateDateHeaderAtIdx(tileIdx);
}
@ -264,6 +262,7 @@ export class TilesCollection extends BaseObservableList {
// would also be called when unloading a part of the timeline
onRemove(index, entry) {
const tileIdx = this._findTileIdx(entry);
const tile = this._findTileAtIdx(entry, tileIdx);
if (tile) {
const removeTile = tile.removeEntry(entry);
@ -317,6 +316,7 @@ export function tests() {
constructor(entry) {
this.entry = entry;
this.update = null;
this.needsDateSeparator = false;
}
setUpdateEmit(update) {
this.update = update;
@ -346,6 +346,34 @@ export function tests() {
dispose() {}
}
class DateHeaderTile extends TestTile {
get shape() { return TileShape.DateHeader; }
updateNextSibling(next) {
this.next = next;
}
updatePreviousSibling(prev) {
this.next?.updatePreviousSibling(prev);
}
compareEntry(b) {
// important that date tiles as sorted before their next item, but after their previous sibling
return this.next.compareEntry(b) - 0.5;
}
}
class MessageNeedingDateHeaderTile extends TestTile {
get shape() { return TileShape.Message; }
createDateSeparator() {
return new DateHeaderTile(this.entry);
}
updatePreviousSibling(prev) {
if (prev?.shape !== TileShape.DateHeader) {
// 1 day is 10
this.needsDateSeparator = !prev || Math.floor(prev.entry.n / 10) !== Math.floor(this.entry.n / 10);
}
}
}
return {
"don't emit update before add": assert => {
class UpdateOnSiblingTile extends TestTile {
@ -404,6 +432,73 @@ export function tests() {
});
entries.remove(1);
assert.deepEqual(events, ["remove", "update"]);
},
"date tile is added when needed when populating": assert => {
const entries = new ObservableArray([{n: 15}]);
const tileOptions = {
tileClassForEntry: () => MessageNeedingDateHeaderTile,
};
const tiles = new TilesCollection(entries, tileOptions);
tiles.subscribe({});
const tilesArray = Array.from(tiles);
assert.equal(tilesArray.length, 2);
assert.equal(tilesArray[0].shape, TileShape.DateHeader);
assert.equal(tilesArray[1].shape, TileShape.Message);
},
"date header is added when receiving addition": assert => {
const entries = new ObservableArray([{n: 15}]);
const tileOptions = {
tileClassForEntry: () => MessageNeedingDateHeaderTile,
};
const tiles = new TilesCollection(entries, tileOptions);
tiles.subscribe({
onAdd() {},
onRemove() {}
});
entries.insert(0, {n: 5});
const tilesArray = Array.from(tiles);
assert.equal(tilesArray[0].shape, TileShape.DateHeader);
assert.equal(tilesArray[1].shape, TileShape.Message);
assert.equal(tilesArray[2].shape, TileShape.DateHeader);
assert.equal(tilesArray[3].shape, TileShape.Message);
assert.equal(tilesArray.length, 4);
},
"date header is removed and added when loading more messages for the same day": assert => {
const entries = new ObservableArray([{n: 15}]);
const tileOptions = {
tileClassForEntry: () => MessageNeedingDateHeaderTile,
};
const tiles = new TilesCollection(entries, tileOptions);
tiles.subscribe({
onAdd() {},
onRemove() {}
});
entries.insert(0, {n: 12});
const tilesArray = Array.from(tiles);
assert.equal(tilesArray[0].shape, TileShape.DateHeader);
assert.equal(tilesArray[1].shape, TileShape.Message);
assert.equal(tilesArray[2].shape, TileShape.Message);
assert.equal(tilesArray.length, 3);
},
"date header is removed at the end of the timeline": assert => {
const entries = new ObservableArray([{n: 5}, {n: 15}]);
const tileOptions = {
tileClassForEntry: () => MessageNeedingDateHeaderTile,
};
const tiles = new TilesCollection(entries, tileOptions);
let removals = 0;
tiles.subscribe({
onAdd() {},
onRemove() {
removals += 1;
}
});
entries.remove(1);
const tilesArray = Array.from(tiles);
assert.equal(tilesArray[0].shape, TileShape.DateHeader);
assert.equal(tilesArray[1].shape, TileShape.Message);
assert.equal(tilesArray.length, 2);
assert.equal(removals, 2);
}
}
}

View File

@ -150,3 +150,29 @@ export class DateTile extends ViewModel implements ITile<BaseEventEntry> {
}
}
import { EventEntry } from "../../../../../matrix/room/timeline/entries/EventEntry.js";
import { SimpleTile } from "./SimpleTile";
export function tests() {
return {
"date tile sorts before reference tile": assert => {
const a = new SimpleTile(new EventEntry({
event: {},
eventIndex: 2,
fragmentId: 1
}, undefined), {});
const b = new SimpleTile(new EventEntry({
event: {},
eventIndex: 3,
fragmentId: 1
}, undefined), {});
const d = new DateTile(b, {} as any);
const tiles = [d, b, a];
tiles.sort((a, b) => a.compare(b));
assert.equal(tiles[0], a);
assert.equal(tiles[1], d);
assert.equal(tiles[2], b);
}
}
}

View File

@ -184,3 +184,65 @@ export class SimpleTile extends ViewModel {
return this._options.timeline.me;
}
}
import { EventEntry } from "../../../../../matrix/room/timeline/entries/EventEntry.js";
export function tests() {
return {
"needsDateSeparator is false when previous sibling is for same date": assert => {
const fridayEntry = new EventEntry({
event: {
origin_server_ts: 1669376446222,
type: "m.room.message",
content: {}
}
}, undefined);
const thursdayEntry = new EventEntry({
event: {
origin_server_ts: fridayEntry.timestamp - (60 * 60 * 8 * 1000),
type: "m.room.message",
content: {}
}
}, undefined);
const fridayTile = new SimpleTile(fridayEntry, {});
const thursdayTile = new SimpleTile(thursdayEntry, {});
assert.equal(fridayTile.needsDateSeparator, false);
fridayTile.updatePreviousSibling(thursdayTile);
assert.equal(fridayTile.needsDateSeparator, false);
},
"needsDateSeparator is true when previous sibling is for different date": assert => {
const fridayEntry = new EventEntry({
event: {
origin_server_ts: 1669376446222,
type: "m.room.message",
content: {}
}
}, undefined);
const thursdayEntry = new EventEntry({
event: {
origin_server_ts: fridayEntry.timestamp - (60 * 60 * 24 * 1000),
type: "m.room.message",
content: {}
}
}, undefined);
const fridayTile = new SimpleTile(fridayEntry, {});
const thursdayTile = new SimpleTile(thursdayEntry, {});
assert.equal(fridayTile.needsDateSeparator, false);
fridayTile.updatePreviousSibling(thursdayTile);
assert.equal(fridayTile.needsDateSeparator, true);
},
"needsDateSeparator is true when previous sibling is undefined": assert => {
const fridayEntry = new EventEntry({
event: {
origin_server_ts: 1669376446222,
type: "m.room.message",
content: {}
}
}, undefined);
const fridayTile = new SimpleTile(fridayEntry, {});
assert.equal(fridayTile.needsDateSeparator, false);
fridayTile.updatePreviousSibling(undefined);
assert.equal(fridayTile.needsDateSeparator, true);
},
}
}