mirror of
https://github.com/vector-im/hydrogen-web.git
synced 2025-02-02 15:41:41 +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)) {
|
if (!currentTile || !currentTile.tryIncludeEntry(entry)) {
|
||||||
currentTile = this._createTile(entry);
|
currentTile = this._createTile(entry);
|
||||||
if (currentTile) {
|
if (currentTile) {
|
||||||
console.log("adding initial tile", currentTile.shape, currentTile.eventId, "at", this._tiles.length);
|
|
||||||
this._tiles.push(currentTile);
|
this._tiles.push(currentTile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -142,7 +141,6 @@ export class TilesCollection extends BaseObservableList {
|
|||||||
|
|
||||||
const newTile = this._createTile(entry);
|
const newTile = this._createTile(entry);
|
||||||
if (newTile) {
|
if (newTile) {
|
||||||
console.log("adding tile", newTile.shape, newTile.eventId, "at", tileIdx);
|
|
||||||
this._addTileAt(tileIdx, newTile);
|
this._addTileAt(tileIdx, newTile);
|
||||||
this._evaluateDateHeaderAtIdx(tileIdx);
|
this._evaluateDateHeaderAtIdx(tileIdx);
|
||||||
}
|
}
|
||||||
@ -264,6 +262,7 @@ export class TilesCollection extends BaseObservableList {
|
|||||||
// would also be called when unloading a part of the timeline
|
// would also be called when unloading a part of the timeline
|
||||||
onRemove(index, entry) {
|
onRemove(index, entry) {
|
||||||
const tileIdx = this._findTileIdx(entry);
|
const tileIdx = this._findTileIdx(entry);
|
||||||
|
|
||||||
const tile = this._findTileAtIdx(entry, tileIdx);
|
const tile = this._findTileAtIdx(entry, tileIdx);
|
||||||
if (tile) {
|
if (tile) {
|
||||||
const removeTile = tile.removeEntry(entry);
|
const removeTile = tile.removeEntry(entry);
|
||||||
@ -317,6 +316,7 @@ export function tests() {
|
|||||||
constructor(entry) {
|
constructor(entry) {
|
||||||
this.entry = entry;
|
this.entry = entry;
|
||||||
this.update = null;
|
this.update = null;
|
||||||
|
this.needsDateSeparator = false;
|
||||||
}
|
}
|
||||||
setUpdateEmit(update) {
|
setUpdateEmit(update) {
|
||||||
this.update = update;
|
this.update = update;
|
||||||
@ -346,6 +346,34 @@ export function tests() {
|
|||||||
dispose() {}
|
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 {
|
return {
|
||||||
"don't emit update before add": assert => {
|
"don't emit update before add": assert => {
|
||||||
class UpdateOnSiblingTile extends TestTile {
|
class UpdateOnSiblingTile extends TestTile {
|
||||||
@ -404,6 +432,73 @@ export function tests() {
|
|||||||
});
|
});
|
||||||
entries.remove(1);
|
entries.remove(1);
|
||||||
assert.deepEqual(events, ["remove", "update"]);
|
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;
|
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