mirror of
https://github.com/vector-im/hydrogen-web.git
synced 2025-02-02 07:31:38 +01:00
add tests
Co-authored-by: R Midhun Suresh <MidhunSureshR@users.noreply.github.com>
This commit is contained in:
parent
7c6d651b32
commit
b5d5adaa36
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
},
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user