diff --git a/lite.koboldai.net b/lite.koboldai.net new file mode 120000 index 0000000000000000000000000000000000000000..a801b2153cf20e5ef65e662ff71c3c16dca87e06 --- /dev/null +++ b/lite.koboldai.net @@ -0,0 +1 @@ +../lite.koboldai.dev_LR \ No newline at end of file diff --git a/static/playwright.config.ts b/static/playwright.config.ts index 8caafab1250cc2d5ce369b5f97c941017e034ea4..84963d01f73a7f14cc5cc4ac59cc0da23a59fe7d 100644 --- a/static/playwright.config.ts +++ b/static/playwright.config.ts @@ -87,7 +87,7 @@ export default defineConfig({ { name: 'MobileSafari', grep: /test-classic-landscape-mobile-iphone/, - use: { ...devices['iPhone 13'] }, + use: { ...devices['iPhone 13 landscape'] }, }, { diff --git a/static/tests/test-classic-desktop-0-lite.koboldai.net.spec.ts b/static/tests/test-classic-desktop-0-lite.koboldai.net.spec.ts index 0e578ac822855dbff6dcdccc97b7efe2524b4252..4dcfa371aba9c258877d08b6d5f554402a993e60 100644 --- a/static/tests/test-classic-desktop-0-lite.koboldai.net.spec.ts +++ b/static/tests/test-classic-desktop-0-lite.koboldai.net.spec.ts @@ -10,9 +10,15 @@ * 6. Navigate between value list and tables, and assert correct UI updates and ARIA snapshots for accessibility. */ import { test, expect, Page } from '@playwright/test'; -import { assertCellAndLink } from './test-helper' +import { assertCellAndLinkAriaSnapshot, uploadFileWithPageAndFilepath } from './test-helper' const testStoryJsonTxt = `${import.meta.dirname}/../../tests/events/very_long_text.json` +const expectedStringArray = [ + "THE BOY WHO LIVEDMr. and Mrs. Dursley, of number four, Privet Drive, were proud to say that they were perfectly normal, thank you very much. They were the last people you'd expect to be involved in anything strange or mysterious, because they just didn't hold with such nonsense.Mr. Dursley was the director of a firm called Grunnings, which made drills. He was a big, beefy man with hardly any neck, although he did have a very large mustache. Mrs. Dursley was thin and blonde and had nearly twice the usual amount of neck, which came in very useful as she spent so much of her time craning over garden fences, spying on the neighbors. The Dursley s had a small son called Dudley and in their opinion there was no finer boy anywhere.The Dursleys had everything they wanted, but they also had a secret, and their greatest fear was that somebody would discover it. They didn't think they could bear it if anyone found out about the Potters. Mrs. Potter was Mrs. Dursley's sister, but they hadn'tmet for several years; in fact, Mrs. Dursley pretended she didn't have a sister, because her sister and her good-for-nothing husband were as unDursleyish as it was possible to be. The Dursleys shuddered to think what the neighbors would say if the Potters arrived in the street. The Dursleys knew that the Potters had a small son, too, but they had never even seen him.This boy was another good reason for keeping the Potters away; they didn't want Dudley mixing with a child like that.When Mr. and Mrs. Dursley woke up on the dull, gray Tuesday our story starts, there was nothing about the cloudy sky outside to suggest that strange and mysterious things would soon be happening all over the country. Mr. Dursley hummed as he picked out his most boring tie for work, and Mrs. Dursley gossiped away happily as she wrestled a screaming Dudley into his high chair.None of them noticed a large, tawny owl flutter past the window.At half past eight, Mr. Dursley picked up his briefcase, pecked Mrs. Dursley on the cheek, and tried to kiss Dudley good-bye but missed, because Dudley was now having a tantrum and throwing his cereal at the walls. \"Little tyke,\" chortled Mr. Dursley as he left the house. He got into his car and backed out of number four's drive.It was on the corner of the street that he noticed the first sign of something peculiar — a cat reading a map. For a second, Mr. Dursley didn't realize what he had seen — then he jerked his head around to look again. There was a tabby cat standing on the corner of Privet Drive, but there wasn't a map in sight. What could he have been thinking of? It must have been a trick of the light. Mr. Dursley blinked and stared atthe cat. It stared back. As Mr. Dursley drove around the corner and up the road, he watched the cat in his mirror. It was now reading the sign that said Privet Drive — no, looking at the sign; cats couldn't read maps or signs. Mr. Dursley gave himself a little shake and put the cat out of his mind. As he drove toward town he thought of nothing except a large order of drills he was hoping to get that day.", + "Harry looked back at Hagrid, smiling, and saw that Hagrid was positively beaming at him.\"See?\" said Hagrid. \"Harry Potter, not a wizard — you wait, you'll be right famous at Hogwarts.\"But Uncle Vernon wasn't going to give in without a fight.\"Haven't I told you he's not going?\" he hissed. \"He's going to Stonewall High and he'll be grateful for it. I've read those letters and he needs all sorts of rubbish — spell books and wands and — \"\"If he wants ter go, a great Muggle like you won't stop him,\" growled Hagrid. \"Stop Lily an' James Potter's son goin' ter Hogwarts! Yer mad. His name's been down ever since he was born. He's off ter the finest school of witchcraft and wizardry in the world. Seven years there and he won't know himself. He'll be with youngsters of his own sort, fer a change, an' he'll be under the greatest headmaster Hogwarts ever had, Albus Dumbled — \"\"I AM NOT PAYING FOR SOME CRACKPOT OLD FOOL TO TEACH HIM MAGIC TRICKS!\" yelled Uncle Vernon.But he had finally gone too far. Hagrid seized his umbrella and whirled it over his head, \"NEVER — \" he thundered, \"— INSULT — ALBUS — DUMBLEDORE — IN — FRONT — OF — ME!\"He brought the umbrella swishing down through the air to point at Dudley — there was a flash of violet light, a sound like a firecracker, a sharp squeal, andthe next second, Dudley was dancing on the spot with his hands clasped over his fat bottom, howling in pain. When he turned his back on them, Harry saw a curly pig's tail poking through a hole in his trousers.Uncle Vernon roared. Pulling Aunt Petunia and Dudley into the other room, he cast one last terrified look at Hagrid and slammed the door behind them.Hagrid looked down at his umbrella and stroked his beard.\"Shouldn'ta lost me temper,\" he said ruefully, \"but it didn't work anyway. Meant ter turn him into a pig, but I suppose he was so much like a pig anyway there wasn't much left ter do.\"He cast a sideways look at Harry under his bushy eyebrows.\"Be grateful if yeh didn't mention that ter anyone at Hogwarts,\" he said. \"I'm — er — not supposed ter do magic, strictly speakin'. I was allowed ter do a bit ter follow yeh an' get yer letters to yeh an' stuff — one o' the reasons I was so keen ter take on the job — \"\"Why aren't you supposed to do magic?\" asked Harry.\"Oh, well — I was at Hogwarts meself but I — er — got expelled, ter tell yeh the truth. In me third year. They snapped me wand in half an' everything. But Dumbledore let me stay on as gamekeeper. Great man, Dumbledore.\"\"Why were you expelled?\"\"It's gettin' late and we've got lots ter do tomorrow,\" said Hagrid loudly. \"Gotta get up ter town, get all yer books an' that.\"He took off his thick black coat and threw it to Harry.\"You can kip under that,\" he said. \"Don' mind if it wriggles a bit, I think I still got a couple o' dormice in one o' the pockets.\"Harry woke early the next morning. Although he could", + "Mr. and Mrs. Dursley, of number four, Privet Drive, were proud to say that they were perfectly normal, thank you very much. They were the last people you'd expect to be involved in anything strange or mysterious, because they just didn't hold with such nonsense.Mr. Dursley was the director of a firm called Grunnings, which made drills. He was a big, beefy man with hardly any neck, although he did have a very large mustache. Mrs. Dursley was thin and blonde and had nearly twice the usual amount of neck, which came in very useful as she spent so much of her time craning over garden fences, spying on the neighbors. The Dursley s had a small son called Dudley and in their opinion there was no finer boy anywhere.The Dursleys had everything they wanted, but they also had a secret, and their greatest fear was that somebody would discover it. They didn't think they could bear it if anyone found out about the Potters. Mrs. Potter was Mrs. Dursley's sister, but they hadn'tmet for several years; in fact, Mrs. Dursley pretended she didn't have a sister, because her sister and her good-for-nothing husband were as unDursleyish as it was possible to be. The Dursleys shuddered to think what the neighbors would say if the Potters arrived in the street. The Dursleys knew that the Potters had a small son, too, but they had never even seen him.This boy was another good reason for keeping the Potters away; they didn't want Dudley mixing with a child like that.When Mr. and Mrs. Dursley woke up on the dull, gray Tuesday our story starts, there was nothing about the cloudy sky outside to suggest that strange and mysterious things would soon be happening all over the country. Mr. Dursley hummed as he picked out his most boring tie for work, and Mrs. Dursley gossiped away happily as she wrestled a screaming Dudley into his high chair.None of them noticed a large, tawny owl flutter past the window.At half past eight, Mr. Dursley picked up his briefcase, pecked Mrs. Dursley on the cheek, and tried to kiss Dudley good-bye but missed, because Dudley was now having a tantrum and throwing his cereal at the walls. \"Little tyke,\" chortled Mr. Dursley as he left the house. He got into his car and backed out of number four's drive.It was on the corner of the street that he noticed the first sign of something peculiar — a cat reading a map. For a second, Mr. Dursley didn't realize what he had seen — then he jerked his head around to look again. There was a tabby cat standing on the corner of Privet Drive, but there wasn't a map in sight. What could he have been thinking of? It must have been a trick of the light. Mr. Dursley blinked and stared atthe cat. It stared back. As Mr. Dursley drove around the corner and up the road, he watched the cat in his mirror. It was now reading the sign that said Privet Drive — no, looking at the sign; cats couldn't read maps or signs. Mr. Dursley gave himself a little shake and put the cat out of his mind. As he drove toward town he thought of nothing except a large order of drills he was hoping to get that day.", + "The Dursleys had everything they wanted, but they also had a secret, and their greatest fear was that somebody would discover it. They didn't think they could bear it if anyone found out about the Potters. Mrs. Potter was Mrs. Dursley's sister, but they hadn'tmet for several years; in fact, Mrs. Dursley pretended she didn't have a sister, because her sister and her good-for-nothing husband were as unDursleyish as it was possible to be. The Dursleys shuddered to think what the neighbors would say if the Potters arrived in the street. The Dursleys knew that the Potters had a small son, too, but they had never even seen him.This boy was another good reason for keeping the Potters away; they didn't want Dudley mixing with a child like that.When Mr. and Mrs. Dursley woke up on the dull, gray Tuesday our story starts, there was nothing about the cloudy sky outside to suggest that strange and mysterious things would soon be happening all over the country. Mr. Dursley hummed as he picked out his most boring tie for work, and Mrs. Dursley gossiped away happily as she wrestled a screaming Dudley into his high chair.None of them noticed a large, tawny owl flutter past the window.At half past eight, Mr. Dursley picked up his briefcase, pecked Mrs. Dursley on the cheek, and tried to kiss Dudley good-bye but missed, because Dudley was now having a tantrum and throwing his cereal at the walls. \"Little tyke,\" chortled Mr. Dursley as he left the house. He got into his car and backed out of number four's drive.It was on the corner of the street that he noticed the first sign of something peculiar — a cat reading a map. For a second, Mr. Dursley didn't realize what he had seen — then he jerked his head around to look again. There was a tabby cat standing on the corner of Privet Drive, but there wasn't a map in sight. What could he have been thinking of? It must have been a trick of the light. Mr. Dursley blinked and stared atthe cat. It stared back. As Mr. Dursley drove around the corner and up the road, he watched the cat in his mirror. It was now reading the sign that said Privet Drive — no, looking at the sign; cats couldn't read maps or signs. Mr. Dursley gave himself a little shake and put the cat out of his mind. As he drove toward town he thought of nothing except a large order of drills he was hoping to get that day.But on the edge of town, drills were driven out of his mind by something else. As he sat in the usual morning traffic jam, he couldn't help noticing that there seemed to be a lot of strangely dressed people about. People in cloaks. Mr. Dursley couldn't bear people who dressed in funny clothes — the getups you saw on young people! He supposed this was some stupid new fashion. He drummed his fingers on the steering wheel and his eyes fell on a huddle of these weirdos standing quite close by. They were whispering excitedly together. Mr. Dursley was enraged to see that a couple of them weren't young at all; why, that man had to be older than he was, and wearing an emerald-green cloak! The nerve of him! But then it struck Mr. Dursley that this was probably some silly stunt — these people were obviously collecting for something ... yes, that would be it. The traffic moved on and a few minutes later, Mr. Dursley arrived in the Grunnings parking lot, his mind back on drills.Mr. Dursley always sat with his back to the window in his office on the ninth floor. If he hadn't, he might have found it harder to concentrate on drills that morning. He didn't see the owls swooping past in broad daylight, though people down in the street did; they pointed and gazed open-mouthed as owl after owl sped overhead. Most of them had never seen an owl even at nighttime. Mr. Dursley, however, had a perfectly normal, owl-free morning. He yelled at five different people. He made several important telephone" +] test('test My Ghost Writer, desktop: navigate between the list/tables containing the stemming and the duplicated words', async ({ page }: { page: Page }) => { // 1. Connect to the local web server page @@ -21,15 +27,7 @@ test('test My Ghost Writer, desktop: navigate between the list/tables containing await page.getByRole('button', { name: 'Set UI' }).click(); // 3. Upload a saved JSON story file to provide long text content for analysis - console.log(`preparing uploading of file '${testStoryJsonTxt}'!`) - await page.getByRole('link', { name: 'Save / Load' }).click(); - await page.waitForTimeout(100) - const fileChooserPromise = page.waitForEvent('filechooser'); - await page.getByRole('button', { name: '📁 Open File' }).click(); - const fileChooser = await fileChooserPromise; - await fileChooser.setFiles(testStoryJsonTxt); - await page.waitForTimeout(300) - console.log(`file '${testStoryJsonTxt}' uploaded!`) + await uploadFileWithPageAndFilepath(page, testStoryJsonTxt) // 4. Activate "My Ghost Writer" / text stats functionality via settings await page.getByRole('link', { name: 'Settings' }).click(); @@ -65,9 +63,9 @@ test('test My Ghost Writer, desktop: navigate between the list/tables containing await expect(currentTitleTableOfWords).toContainText('the : 734 '); await expect(currentTitleTableOfWords).toHaveAttribute("title", "stem: 'the'") - await assertCellAndLink(page, gameEditor, 'id-table-0-row-0-nth', "THE BOY WHO"); - await assertCellAndLink(page, gameEditor, 'id-table-0-row-733-nth', "early the next"); - await assertCellAndLink(page, gameEditor, 'id-table-0-row-1-nth', "They were the last"); + await assertCellAndLinkAriaSnapshot(page, 'id-table-0-row-0-nth', "THE BOY WHO", "gametext", expectedStringArray[0]); + await assertCellAndLinkAriaSnapshot(page, 'id-table-0-row-733-nth', "early the next", "gametext", expectedStringArray[1]); + await assertCellAndLinkAriaSnapshot(page, 'id-table-0-row-1-nth', "They were the last", "gametext", expectedStringArray[2]); await page.getByText('the Dursleys:').click(); await page.waitForTimeout(100) @@ -76,11 +74,10 @@ test('test My Ghost Writer, desktop: navigate between the list/tables containing await page.getByLabel('id-list-of-words-11-nth').click(); await page.waitForTimeout(100) - await assertCellAndLink(page, gameEditor, 'id-table-11-row-2-nth', "to be. The Dursleys shuddered", false); - + await assertCellAndLinkAriaSnapshot(page, 'id-table-11-row-2-nth', "to be. The Dursleys shuddered", "gametext", expectedStringArray[3]); + let col2wordsFreq = page.getByLabel('id-col2-words-frequency', { exact: true }) - await expect(col2wordsFreq).toHaveScreenshot() + await expect(col2wordsFreq).toMatchAriaSnapshot({ name: `test-classic-desktop-0--end-col2wordsFreq.txt` }); console.log("end!") page.close() }); - diff --git a/static/tests/test-classic-desktop-0-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-desktop-navigate-betwee-13eaa-taining-the-stemming-and-the-duplicated-words-2-chromium-darwin.png b/static/tests/test-classic-desktop-0-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-desktop-navigate-betwee-13eaa-taining-the-stemming-and-the-duplicated-words-2-chromium-darwin.png deleted file mode 100644 index 6f146ab0bcb2379a4ff5cac52a2ff1b9a98c330e..0000000000000000000000000000000000000000 --- a/static/tests/test-classic-desktop-0-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-desktop-navigate-betwee-13eaa-taining-the-stemming-and-the-duplicated-words-2-chromium-darwin.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2938f3c56beb7dc38d65db60e7dd7cf620cc68ded3347a715f5fc153700d7f16 -size 246482 diff --git a/static/tests/test-classic-desktop-0-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-desktop-navigate-betwee-434be-taining-the-stemming-and-the-duplicated-words-1-chromium-darwin.png b/static/tests/test-classic-desktop-0-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-desktop-navigate-betwee-434be-taining-the-stemming-and-the-duplicated-words-1-chromium-darwin.png deleted file mode 100644 index 0844949741189679e2c315863a0de759ab6e32ad..0000000000000000000000000000000000000000 --- a/static/tests/test-classic-desktop-0-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-desktop-navigate-betwee-434be-taining-the-stemming-and-the-duplicated-words-1-chromium-darwin.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:64b416840ee1664dcb07ac73f796729d912c36e1163d5d306a953498db44f7aa -size 245248 diff --git a/static/tests/test-classic-desktop-0-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-desktop-navigate-betwee-65a69-taining-the-stemming-and-the-duplicated-words-3-chromium-darwin.png b/static/tests/test-classic-desktop-0-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-desktop-navigate-betwee-65a69-taining-the-stemming-and-the-duplicated-words-3-chromium-darwin.png deleted file mode 100644 index a63afde571b3ebed9b3808408fcd0a7f7478e172..0000000000000000000000000000000000000000 --- a/static/tests/test-classic-desktop-0-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-desktop-navigate-betwee-65a69-taining-the-stemming-and-the-duplicated-words-3-chromium-darwin.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a12899a25b6a1d1e6b824225be469f8d3fe2da41603647efe37bc9b3b5a86765 -size 254259 diff --git a/static/tests/test-classic-desktop-0-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-desktop-navigate-betwee-713b1-taining-the-stemming-and-the-duplicated-words-4-chromium-darwin.png b/static/tests/test-classic-desktop-0-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-desktop-navigate-betwee-713b1-taining-the-stemming-and-the-duplicated-words-4-chromium-darwin.png deleted file mode 100644 index 32774f8c8889ad2df0b0e2922876fe52af0eac94..0000000000000000000000000000000000000000 --- a/static/tests/test-classic-desktop-0-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-desktop-navigate-betwee-713b1-taining-the-stemming-and-the-duplicated-words-4-chromium-darwin.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:578581eeaf278acf1c0f9b93d9565d9cfd613340e5969a82a71c9b749561ab48 -size 129196 diff --git a/static/tests/test-classic-desktop-0-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-desktop-navigate-between-the-value-list-tables-1-chromium-darwin.png b/static/tests/test-classic-desktop-0-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-desktop-navigate-between-the-value-list-tables-1-chromium-darwin.png deleted file mode 100644 index 0844949741189679e2c315863a0de759ab6e32ad..0000000000000000000000000000000000000000 --- a/static/tests/test-classic-desktop-0-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-desktop-navigate-between-the-value-list-tables-1-chromium-darwin.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:64b416840ee1664dcb07ac73f796729d912c36e1163d5d306a953498db44f7aa -size 245248 diff --git a/static/tests/test-classic-desktop-0-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-desktop-navigate-between-the-value-list-tables-2-chromium-darwin.png b/static/tests/test-classic-desktop-0-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-desktop-navigate-between-the-value-list-tables-2-chromium-darwin.png deleted file mode 100644 index 6f146ab0bcb2379a4ff5cac52a2ff1b9a98c330e..0000000000000000000000000000000000000000 --- a/static/tests/test-classic-desktop-0-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-desktop-navigate-between-the-value-list-tables-2-chromium-darwin.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2938f3c56beb7dc38d65db60e7dd7cf620cc68ded3347a715f5fc153700d7f16 -size 246482 diff --git a/static/tests/test-classic-desktop-0-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-desktop-navigate-between-the-value-list-tables-3-chromium-darwin.png b/static/tests/test-classic-desktop-0-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-desktop-navigate-between-the-value-list-tables-3-chromium-darwin.png deleted file mode 100644 index a63afde571b3ebed9b3808408fcd0a7f7478e172..0000000000000000000000000000000000000000 --- a/static/tests/test-classic-desktop-0-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-desktop-navigate-between-the-value-list-tables-3-chromium-darwin.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a12899a25b6a1d1e6b824225be469f8d3fe2da41603647efe37bc9b3b5a86765 -size 254259 diff --git a/static/tests/test-classic-desktop-0-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-desktop-navigate-between-the-value-list-tables-4-chromium-darwin.png b/static/tests/test-classic-desktop-0-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-desktop-navigate-between-the-value-list-tables-4-chromium-darwin.png deleted file mode 100644 index 32774f8c8889ad2df0b0e2922876fe52af0eac94..0000000000000000000000000000000000000000 --- a/static/tests/test-classic-desktop-0-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-desktop-navigate-between-the-value-list-tables-4-chromium-darwin.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:578581eeaf278acf1c0f9b93d9565d9cfd613340e5969a82a71c9b749561ab48 -size 129196 diff --git a/static/tests/test-classic-desktop-0-lite.koboldai.net.spec.ts-snapshots/test-classic-desktop-0--end-col2wordsFreq.txt b/static/tests/test-classic-desktop-0-lite.koboldai.net.spec.ts-snapshots/test-classic-desktop-0--end-col2wordsFreq.txt new file mode 100644 index 0000000000000000000000000000000000000000..79699cc6a832aa610abd276f1588850a45df9f6f --- /dev/null +++ b/static/tests/test-classic-desktop-0-lite.koboldai.net.spec.ts-snapshots/test-classic-desktop-0--end-col2wordsFreq.txt @@ -0,0 +1,1778 @@ +- text: /\d+ stems, \d+ rows/ +- searchbox "filter-words-frequency" +- combobox "id-select-order-by": + - option "order-by-up-opt" + - option "order-by-down-opt" [selected] +- combobox "id-select-sort-by": + - option "sort-by-found-words-opt" [selected] + - option "sort-by-name-opt" + - option "sort-by-ngram-words-opt" +- text: "/th : \\d+ occurrences/" +- listitem: "/the: \\d+ repetitions/" +- listitem: "/that: \\d+ repetitions/" +- listitem: "/they: \\d+ repetitions/" +- listitem: "/with: \\d+ repetitions/" +- listitem: "/on the: \\d+ repetitions/" +- listitem: "/this: \\d+ repetitions/" +- listitem: "/them: \\d+ repetitions/" +- listitem: "/there: \\d+ repetitions/" +- listitem: "/in the: \\d+ repetitions/" +- listitem: "/of the: \\d+ repetitions/" +- listitem: "/at the: \\d+ repetitions/" +- listitem: "/the Dursleys: \\d+ repetitions/" +- listitem: "/their: \\d+ repetitions/" +- listitem: "/then: \\d+ repetitions/" +- listitem: "/\\. The: \\d+ repetitions/" +- listitem: "/things: \\d+ repetitions/" +- listitem: "/something: \\d+ repetitions/" +- listitem: "/to the: \\d+ repetitions/" +- listitem: "/into the: \\d+ repetitions/" +- listitem: "/, the: \\d+ repetitions/" +- listitem: "/think: \\d+ repetitions/" +- listitem: "/though: \\d+ repetitions/" +- listitem: "/anything: \\d+ repetitions/" +- listitem: "/thought: \\d+ repetitions/" +- listitem: "/they': \\d+ repetitions/" +- listitem: "/through: \\d+ repetitions/" +- listitem: "/there was: \\d+ repetitions/" +- listitem: "/with a: \\d+ repetitions/" +- listitem: "/\\. They: \\d+ repetitions/" +- listitem: "/as though: \\d+ repetitions/" +- listitem: "/the letter: \\d+ repetitions/" +- listitem: "/the cat: \\d+ repetitions/" +- listitem: "/they were: \\d+ repetitions/" +- listitem: "/was the: \\d+ repetitions/" +- listitem: "/over the: \\d+ repetitions/" +- listitem: "/of them: \\d+ repetitions/" +- listitem: "/than: \\d+ repetitions/" +- listitem: "/that': \\d+ repetitions/" +- listitem: "/through the: \\d+ repetitions/" +- listitem: "/the house: \\d+ repetitions/" +- listitem: "/from the: \\d+ repetitions/" +- listitem: "/the door: \\d+ repetitions/" +- listitem: "/them\\.: \\d+ repetitions/" +- listitem: "/the giant: \\d+ repetitions/" +- listitem: "/the kitchen: \\d+ repetitions/" +- listitem: "/the street: \\d+ repetitions/" +- listitem: "/the first: \\d+ repetitions/" +- listitem: "/all the: \\d+ repetitions/" +- listitem: "/and the: \\d+ repetitions/" +- listitem: "/, they: \\d+ repetitions/" +- listitem: "/other: \\d+ repetitions/" +- listitem: "/mother: \\d+ repetitions/" +- listitem: "/the snake: \\d+ repetitions/" +- listitem: "/the Potters: \\d+ repetitions/" +- listitem: "/with his: \\d+ repetitions/" +- listitem: "/the next: \\d+ repetitions/" +- listitem: "/his mother: \\d+ repetitions/" +- listitem: "/and then: \\d+ repetitions/" +- listitem: "/the glass: \\d+ repetitions/" +- listitem: "/another: \\d+ repetitions/" +- listitem: "/nothing: \\d+ repetitions/" +- listitem: "/them,: \\d+ repetitions/" +- listitem: "/the same: \\d+ repetitions/" +- listitem: "/with the: \\d+ repetitions/" +- listitem: "/by the: \\d+ repetitions/" +- listitem: "/the way: \\d+ repetitions/" +- listitem: "that the: 9 repetitions" +- listitem: "the wall: 9 repetitions" +- listitem: "that he: 9 repetitions" +- listitem: "these: 9 repetitions" +- listitem: "the only: 9 repetitions" +- listitem: "down the: 9 repetitions" +- listitem: "without: 9 repetitions" +- listitem: "birthday: 9 repetitions" +- listitem: "the car: 9 repetitions" +- listitem: "everything: 8 repetitions" +- listitem: ", there: 8 repetitions" +- listitem: "the corner: 8 repetitions" +- listitem: "around the: 8 repetitions" +- listitem: "up the: 8 repetitions" +- listitem: "this was: 8 repetitions" +- listitem: ", that: 8 repetitions" +- listitem: "the front: 8 repetitions" +- listitem: "both: 8 repetitions" +- listitem: "rather: 8 repetitions" +- listitem: "\"That: 8 repetitions" +- listitem: "father: 8 repetitions" +- listitem: "for the: 8 repetitions" +- listitem: "though he: 8 repetitions" +- listitem: "the mail: 8 repetitions" +- listitem: "the boy: 7 repetitions" +- listitem: ". There: 7 repetitions" +- listitem: "the owls: 7 repetitions" +- listitem: "that was: 7 repetitions" +- listitem: "said the: 7 repetitions" +- listitem: "the other: 7 repetitions" +- listitem: "threw: 7 repetitions" +- listitem: "then,: 7 repetitions" +- listitem: "under the: 7 repetitions" +- listitem: "the sofa: 7 repetitions" +- listitem: "' the: 7 repetitions" +- listitem: "thin: 6 repetitions" +- listitem: "but they: 6 repetitions" +- listitem: "they could: 6 repetitions" +- listitem: "about the: 6 repetitions" +- listitem: "to think: 6 repetitions" +- listitem: "he thought: 6 repetitions" +- listitem: "clothes: 6 repetitions" +- listitem: "together: 6 repetitions" +- listitem: ". This: 6 repetitions" +- listitem: "do with: 6 repetitions" +- listitem: "as they: 6 repetitions" +- listitem: "there.: 6 repetitions" +- listitem: "but the: 6 repetitions" +- listitem: "the air: 6 repetitions" +- listitem: "mouth: 6 repetitions" +- listitem: "his father: 6 repetitions" +- listitem: "the room: 6 repetitions" +- listitem: "the hall: 6 repetitions" +- listitem: "the time: 6 repetitions" +- listitem: "the zoo: 6 repetitions" +- listitem: "thank: 5 repetitions" +- listitem: "was that: 5 repetitions" +- listitem: "t think: 5 repetitions" +- listitem: "they had: 5 repetitions" +- listitem: "Then he: 5 repetitions" +- listitem: ", though: 5 repetitions" +- listitem: "thought he: 5 repetitions" +- listitem: "\"The: 5 repetitions" +- listitem: "as the: 5 repetitions" +- listitem: "that,: 5 repetitions" +- listitem: "all this: 5 repetitions" +- listitem: "the whole: 5 repetitions" +- listitem: "though she: 5 repetitions" +- listitem: ". Then: 5 repetitions" +- listitem: "three: 5 repetitions" +- listitem: "the table: 5 repetitions" +- listitem: "that Harry: 5 repetitions" +- listitem: "thick: 5 repetitions" +- listitem: "that Dudley: 5 repetitions" +- listitem: "this,: 5 repetitions" +- listitem: "the back: 5 repetitions" +- listitem: "get the: 5 repetitions" +- listitem: "and threw: 5 repetitions" +- listitem: "although: 4 repetitions" +- listitem: "they didn: 4 repetitions" +- listitem: "if the: 4 repetitions" +- listitem: "like that: 4 repetitions" +- listitem: "the lights: 4 repetitions" +- listitem: "the road: 4 repetitions" +- listitem: "— the: 4 repetitions" +- listitem: "than he: 4 repetitions" +- listitem: "these people: 4 repetitions" +- listitem: "for something: 4 repetitions" +- listitem: "something to: 4 repetitions" +- listitem: "there were: 4 repetitions" +- listitem: "outside the: 4 repetitions" +- listitem: "the ground: 4 repetitions" +- listitem: "the living: 4 repetitions" +- listitem: "something.: 4 repetitions" +- listitem: "the Muggles: 4 repetitions" +- listitem: "the moment: 4 repetitions" +- listitem: "is that: 4 repetitions" +- listitem: "And they: 4 repetitions" +- listitem: "s the: 4 repetitions" +- listitem: "toward the: 4 repetitions" +- listitem: "open the: 4 repetitions" +- listitem: "mother.: 4 repetitions" +- listitem: "there,: 4 repetitions" +- listitem: "the day: 4 repetitions" +- listitem: "s birthday: 4 repetitions" +- listitem: "thirty: 4 repetitions" +- listitem: ", with: 4 repetitions" +- listitem: "the floor: 4 repetitions" +- listitem: "thinking about: 4 repetitions" +- listitem: "breath: 4 repetitions" +- listitem: "the rock: 4 repetitions" +- listitem: "the hut: 4 repetitions" +- listitem: "the sea: 4 repetitions" +- listitem: "that they: 3 repetitions" +- listitem: ", thank: 3 repetitions" +- listitem: "thank you: 3 repetitions" +- listitem: "were the: 3 repetitions" +- listitem: "with such: 3 repetitions" +- listitem: "although he: 3 repetitions" +- listitem: "in their: 3 repetitions" +- listitem: "think they: 3 repetitions" +- listitem: "knew that: 3 repetitions" +- listitem: "this boy: 3 repetitions" +- listitem: "; they: 3 repetitions" +- listitem: "that.: 3 repetitions" +- listitem: "there wasn: 3 repetitions" +- listitem: "think of: 3 repetitions" +- listitem: "read the: 3 repetitions" +- listitem: "the sign: 3 repetitions" +- listitem: "put the: 3 repetitions" +- listitem: "get that: 3 repetitions" +- listitem: "the edge: 3 repetitions" +- listitem: "of these: 3 repetitions" +- listitem: "together.: 3 repetitions" +- listitem: "across the: 3 repetitions" +- listitem: "the people: 3 repetitions" +- listitem: "those: 3 repetitions" +- listitem: "realized that: 3 repetitions" +- listitem: "the man: 3 repetitions" +- listitem: ", this: 3 repetitions" +- listitem: "the middle: 3 repetitions" +- listitem: "had the: 3 repetitions" +- listitem: "anything to: 3 repetitions" +- listitem: "Only the: 3 repetitions" +- listitem: "the place: 3 repetitions" +- listitem: "the name: 3 repetitions" +- listitem: "they went: 3 repetitions" +- listitem: "That evening: 3 repetitions" +- listitem: ", thin: 3 repetitions" +- listitem: "of their: 3 repetitions" +- listitem: "the very: 3 repetitions" +- listitem: "find the: 3 repetitions" +- listitem: "— that: 3 repetitions" +- listitem: "them all: 3 repetitions" +- listitem: "the best: 3 repetitions" +- listitem: "the top: 3 repetitions" +- listitem: "the motorcycle: 3 repetitions" +- listitem: "off the: 3 repetitions" +- listitem: "there?: 3 repetitions" +- listitem: "s that: 3 repetitions" +- listitem: "the night: 3 repetitions" +- listitem: "out the: 3 repetitions" +- listitem: "to their: 3 repetitions" +- listitem: "so that: 3 repetitions" +- listitem: "there had: 3 repetitions" +- listitem: "the sound: 3 repetitions" +- listitem: "the cupboard: 3 repetitions" +- listitem: "the second: 3 repetitions" +- listitem: "the rest: 3 repetitions" +- listitem: "father.: 3 repetitions" +- listitem: "at that: 3 repetitions" +- listitem: "that moment: 3 repetitions" +- listitem: "the telephone: 3 repetitions" +- listitem: "the roof: 3 repetitions" +- listitem: "telling them: 3 repetitions" +- listitem: "be with: 3 repetitions" +- listitem: "with Dudley: 3 repetitions" +- listitem: "anything.: 3 repetitions" +- listitem: "they seemed: 3 repetitions" +- listitem: "that it: 3 repetitions" +- listitem: "the reptile: 3 repetitions" +- listitem: "in there: 3 repetitions" +- listitem: "against the: 3 repetitions" +- listitem: "this is: 3 repetitions" +- listitem: "the ceiling: 3 repetitions" +- listitem: "both of: 3 repetitions" +- listitem: "them as: 3 repetitions" +- listitem: "the biggest: 3 repetitions" +- listitem: "the end: 3 repetitions" +- listitem: "each other: 3 repetitions" +- listitem: ", both: 3 repetitions" +- listitem: "the doormat: 3 repetitions" +- listitem: "the envelope: 3 repetitions" +- listitem: "the head: 3 repetitions" +- listitem: "slammed the: 3 repetitions" +- listitem: "behind them: 3 repetitions" +- listitem: "mother,: 3 repetitions" +- listitem: "this time: 3 repetitions" +- listitem: "sure that: 3 repetitions" +- listitem: "the fireplace: 3 repetitions" +- listitem: "thing happened: 3 repetitions" +- listitem: "thundered: 3 repetitions" +- listitem: "the storm: 3 repetitions" +- listitem: "his mouth: 3 repetitions" +- listitem: "the world: 3 repetitions" +- listitem: "somethin: 3 repetitions" +- listitem: "somethin': 3 repetitions" +- listitem: "say that: 2 repetitions" +- listitem: "the last: 2 repetitions" +- listitem: "in anything: 2 repetitions" +- listitem: ", although: 2 repetitions" +- listitem: "the usual: 2 repetitions" +- listitem: "the neighbors: 2 repetitions" +- listitem: "they also: 2 repetitions" +- listitem: "and their: 2 repetitions" +- listitem: "was nothing: 2 repetitions" +- listitem: "the country: 2 repetitions" +- listitem: "the window: 2 repetitions" +- listitem: "left the: 2 repetitions" +- listitem: "of something: 2 repetitions" +- listitem: "— then: 2 repetitions" +- listitem: "but there: 2 repetitions" +- listitem: "been thinking: 2 repetitions" +- listitem: "watched the: 2 repetitions" +- listitem: "that said: 2 repetitions" +- listitem: "that day: 2 repetitions" +- listitem: "something else: 2 repetitions" +- listitem: "that this: 2 repetitions" +- listitem: "drills that: 2 repetitions" +- listitem: "that morning: 2 repetitions" +- listitem: "see the: 2 repetitions" +- listitem: "what they: 2 repetitions" +- listitem: "their son: 2 repetitions" +- listitem: "say something: 2 repetitions" +- listitem: "to them: 2 repetitions" +- listitem: "but thought: 2 repetitions" +- listitem: "thinking ...: 2 repetitions" +- listitem: "sure there: 2 repetitions" +- listitem: "that afternoon: 2 repetitions" +- listitem: "voice that: 2 repetitions" +- listitem: "that made: 2 repetitions" +- listitem: "the spot: 2 repetitions" +- listitem: "imagining things: 2 repetitions" +- listitem: "things,: 2 repetitions" +- listitem: "the tabby: 2 repetitions" +- listitem: "Was this: 2 repetitions" +- listitem: "together,: 2 repetitions" +- listitem: "with her: 2 repetitions" +- listitem: "weather: 2 repetitions" +- listitem: ". Although: 2 repetitions" +- listitem: "about that: 2 repetitions" +- listitem: "throat: 2 repetitions" +- listitem: "the news: 2 repetitions" +- listitem: "was something: 2 repetitions" +- listitem: "heard the: 2 repetitions" +- listitem: "bathroom: 2 repetitions" +- listitem: "still there: 2 repetitions" +- listitem: "though it: 2 repetitions" +- listitem: "out that: 2 repetitions" +- listitem: "think he: 2 repetitions" +- listitem: "about them: 2 repetitions" +- listitem: "them and: 2 repetitions" +- listitem: "anything that: 2 repetitions" +- listitem: "before the: 2 repetitions" +- listitem: "like this: 2 repetitions" +- listitem: "this man: 2 repetitions" +- listitem: "the silver: 2 repetitions" +- listitem: "other end: 2 repetitions" +- listitem: "The nearest: 2 repetitions" +- listitem: "out with: 2 repetitions" +- listitem: "a rather: 2 repetitions" +- listitem: "exactly the: 2 repetitions" +- listitem: "noticed something: 2 repetitions" +- listitem: "on their: 2 repetitions" +- listitem: "know that: 2 repetitions" +- listitem: "threw a: 2 repetitions" +- listitem: "re the: 2 repetitions" +- listitem: "the rumors: 2 repetitions" +- listitem: "reached the: 2 repetitions" +- listitem: "the point: 2 repetitions" +- listitem: "the real: 2 repetitions" +- listitem: "and that: 2 repetitions" +- listitem: "the things: 2 repetitions" +- listitem: "things to: 2 repetitions" +- listitem: "beneath: 2 repetitions" +- listitem: "you think: 2 repetitions" +- listitem: "think you: 2 repetitions" +- listitem: "— there: 2 repetitions" +- listitem: "something he: 2 repetitions" +- listitem: "all that: 2 repetitions" +- listitem: "mouth,: 2 repetitions" +- listitem: "then said: 2 repetitions" +- listitem: "is the: 2 repetitions" +- listitem: "think it: 2 repetitions" +- listitem: "Hagrid with: 2 repetitions" +- listitem: "this?: 2 repetitions" +- listitem: "the right: 2 repetitions" +- listitem: "that?: 2 repetitions" +- listitem: "around them: 2 repetitions" +- listitem: "were there: 2 repetitions" +- listitem: "the bundle: 2 repetitions" +- listitem: "get this: 2 repetitions" +- listitem: "wake the: 2 repetitions" +- listitem: "live with: 2 repetitions" +- listitem: "the low: 2 repetitions" +- listitem: "onto the: 2 repetitions" +- listitem: "and with: 2 repetitions" +- listitem: "spend the: 2 repetitions" +- listitem: "at this: 2 repetitions" +- listitem: "the photographs: 2 repetitions" +- listitem: "father,: 2 repetitions" +- listitem: "the bacon: 2 repetitions" +- listitem: "birthday.: 2 repetitions" +- listitem: ", nothing: 2 repetitions" +- listitem: "because the: 2 repetitions" +- listitem: "the stairs: 2 repetitions" +- listitem: "the racing: 2 repetitions" +- listitem: "old clothes: 2 repetitions" +- listitem: "only thing: 2 repetitions" +- listitem: "and thick: 2 repetitions" +- listitem: "his thick: 2 repetitions" +- listitem: "thick,: 2 repetitions" +- listitem: "said that: 2 repetitions" +- listitem: "mother and: 2 repetitions" +- listitem: "and father: 2 repetitions" +- listitem: "less than: 2 repetitions" +- listitem: "turned the: 2 repetitions" +- listitem: "that all: 2 repetitions" +- listitem: "Dudley thought: 2 repetitions" +- listitem: "thirty ...: 2 repetitions" +- listitem: "grabbed the: 2 repetitions" +- listitem: "then.: 2 repetitions" +- listitem: "worth: 2 repetitions" +- listitem: "this.: 2 repetitions" +- listitem: "something very: 2 repetitions" +- listitem: "they weren: 2 repetitions" +- listitem: "That cars: 2 repetitions" +- listitem: "anything he: 2 repetitions" +- listitem: "the gap: 2 repetitions" +- listitem: "with him: 2 repetitions" +- listitem: "before they: 2 repetitions" +- listitem: "in that: 2 repetitions" +- listitem: "do anything: 2 repetitions" +- listitem: "anything,: 2 repetitions" +- listitem: "telling the: 2 repetitions" +- listitem: "clothes and: 2 repetitions" +- listitem: "other hand: 2 repetitions" +- listitem: "the school: 2 repetitions" +- listitem: "behind the: 2 repetitions" +- listitem: "the big: 2 repetitions" +- listitem: "the wind: 2 repetitions" +- listitem: "they don: 2 repetitions" +- listitem: "one thing: 2 repetitions" +- listitem: "about anything: 2 repetitions" +- listitem: "Harry thought: 2 repetitions" +- listitem: "They ate: 2 repetitions" +- listitem: "another one: 2 repetitions" +- listitem: "slithering: 2 repetitions" +- listitem: "found the: 2 repetitions" +- listitem: "worse than: 2 repetitions" +- listitem: "where the: 2 repetitions" +- listitem: "visit the: 2 repetitions" +- listitem: "with Harry: 2 repetitions" +- listitem: "sure the: 2 repetitions" +- listitem: "The boa: 2 repetitions" +- listitem: "; the: 2 repetitions" +- listitem: "The great: 2 repetitions" +- listitem: "The keeper: 2 repetitions" +- listitem: "time they: 2 repetitions" +- listitem: "up with: 2 repetitions" +- listitem: "the green: 2 repetitions" +- listitem: "them in: 2 repetitions" +- listitem: "without a: 2 repetitions" +- listitem: "all these: 2 repetitions" +- listitem: "thought this: 2 repetitions" +- listitem: "\" Then: 2 repetitions" +- listitem: "the family: 2 repetitions" +- listitem: "while the: 2 repetitions" +- listitem: "They heard: 2 repetitions" +- listitem: "the Smelting: 2 repetitions" +- listitem: "that looked: 2 repetitions" +- listitem: "the address: 2 repetitions" +- listitem: "the bill: 2 repetitions" +- listitem: "the postcard: 2 repetitions" +- listitem: "forgotten that: 2 repetitions" +- listitem: "that letter: 2 repetitions" +- listitem: "their necks: 2 repetitions" +- listitem: "them into: 2 repetitions" +- listitem: "the crack: 2 repetitions" +- listitem: "If they: 2 repetitions" +- listitem: "deep breaths: 2 repetitions" +- listitem: "breaths and: 2 repetitions" +- listitem: "about this: 2 repetitions" +- listitem: "things that: 2 repetitions" +- listitem: "the bed: 2 repetitions" +- listitem: "with that: 2 repetitions" +- listitem: "When the: 2 repetitions" +- listitem: "There': 2 repetitions" +- listitem: "And this: 2 repetitions" +- listitem: "the dark: 2 repetitions" +- listitem: "Petunia through: 2 repetitions" +- listitem: "through a: 2 repetitions" +- listitem: "they couldn: 2 repetitions" +- listitem: "their way: 2 repetitions" +- listitem: "their faces: 2 repetitions" +- listitem: "They drove: 2 repetitions" +- listitem: "inside the: 2 repetitions" +- listitem: "his birthdays: 2 repetitions" +- listitem: "thin package: 2 repetitions" +- listitem: "hands together: 2 repetitions" +- listitem: "the empty: 2 repetitions" +- listitem: "those letters: 2 repetitions" +- listitem: "they got: 2 repetitions" +- listitem: "Then —: 2 repetitions" +- listitem: "saw that: 2 repetitions" +- listitem: "that you: 2 repetitions" +- listitem: "threw it: 2 repetitions" +- listitem: "happy birthday: 2 repetitions" +- listitem: "warmth: 2 repetitions" +- listitem: "filled the: 2 repetitions" +- listitem: "the pockets: 2 repetitions" +- listitem: "— this: 2 repetitions" +- listitem: "Harry with: 2 repetitions" +- listitem: ". With: 2 repetitions" +- listitem: "to that: 2 repetitions" +- listitem: "the fire: 2 repetitions" +- listitem: "this wizard: 2 repetitions" +- listitem: "' then: 2 repetitions" +- listitem: "knew they: 2 repetitions" +- listitem: ". That: 2 repetitions" +- listitem: "' that: 2 repetitions" +- listitem: "out there: 2 repetitions" +- listitem: "the greatest: 2 repetitions" +- listitem: "I think: 2 repetitions" +- listitem: "think I: 2 repetitions" +- listitem: "anything strange: 1 repetitions" +- listitem: "because they: 1 repetitions" +- listitem: "they just: 1 repetitions" +- listitem: "hold with: 1 repetitions" +- listitem: "the director: 1 repetitions" +- listitem: "man with: 1 repetitions" +- listitem: "with hardly: 1 repetitions" +- listitem: "was thin: 1 repetitions" +- listitem: "thin and: 1 repetitions" +- listitem: "twice the: 1 repetitions" +- listitem: "their opinion: 1 repetitions" +- listitem: "opinion there: 1 repetitions" +- listitem: "had everything: 1 repetitions" +- listitem: "everything they: 1 repetitions" +- listitem: "they wanted: 1 repetitions" +- listitem: "their greatest: 1 repetitions" +- listitem: "that somebody: 1 repetitions" +- listitem: "they hadn: 1 repetitions" +- listitem: "good-for-nothing: 1 repetitions" +- listitem: "her good-for-nothing: 1 repetitions" +- listitem: "good-for-nothing husband: 1 repetitions" +- listitem: "think what: 1 repetitions" +- listitem: "what the: 1 repetitions" +- listitem: "was another: 1 repetitions" +- listitem: "another good: 1 repetitions" +- listitem: "keeping the: 1 repetitions" +- listitem: "mixing with: 1 repetitions" +- listitem: "the dull: 1 repetitions" +- listitem: "nothing about: 1 repetitions" +- listitem: "the cloudy: 1 repetitions" +- listitem: "suggest that: 1 repetitions" +- listitem: "that strange: 1 repetitions" +- listitem: "mysterious things: 1 repetitions" +- listitem: "things would: 1 repetitions" +- listitem: "them noticed: 1 repetitions" +- listitem: "past the: 1 repetitions" +- listitem: "throwing: 1 repetitions" +- listitem: "the cheek: 1 repetitions" +- listitem: "and throwing: 1 repetitions" +- listitem: "throwing his: 1 repetitions" +- listitem: "street that: 1 repetitions" +- listitem: "noticed the: 1 repetitions" +- listitem: "something peculiar: 1 repetitions" +- listitem: "sign that: 1 repetitions" +- listitem: "thought of: 1 repetitions" +- listitem: "of nothing: 1 repetitions" +- listitem: "nothing except: 1 repetitions" +- listitem: "by something: 1 repetitions" +- listitem: "noticing that: 1 repetitions" +- listitem: "that there: 1 repetitions" +- listitem: "there seemed: 1 repetitions" +- listitem: "funny clothes: 1 repetitions" +- listitem: "clothes —: 1 repetitions" +- listitem: "the getups: 1 repetitions" +- listitem: "supposed this: 1 repetitions" +- listitem: "the steering: 1 repetitions" +- listitem: "these weirdos: 1 repetitions" +- listitem: "excitedly together: 1 repetitions" +- listitem: "see that: 1 repetitions" +- listitem: "that a: 1 repetitions" +- listitem: "them weren: 1 repetitions" +- listitem: "that man: 1 repetitions" +- listitem: "older than: 1 repetitions" +- listitem: "! The: 1 repetitions" +- listitem: "The nerve: 1 repetitions" +- listitem: "But then: 1 repetitions" +- listitem: "then it: 1 repetitions" +- listitem: "Dursley that: 1 repetitions" +- listitem: "— these: 1 repetitions" +- listitem: "something ...: 1 repetitions" +- listitem: "that would: 1 repetitions" +- listitem: "The traffic: 1 repetitions" +- listitem: "the Grunnings: 1 repetitions" +- listitem: "ninth: 1 repetitions" +- listitem: "open-mouthed: 1 repetitions" +- listitem: "sat with: 1 repetitions" +- listitem: "the ninth: 1 repetitions" +- listitem: "ninth floor: 1 repetitions" +- listitem: "though people: 1 repetitions" +- listitem: "they pointed: 1 repetitions" +- listitem: "gazed open-mouthed: 1 repetitions" +- listitem: "open-mouthed as: 1 repetitions" +- listitem: "them had: 1 repetitions" +- listitem: "the bakery: 1 repetitions" +- listitem: "them next: 1 repetitions" +- listitem: "the baker: 1 repetitions" +- listitem: "eyed them: 1 repetitions" +- listitem: "them angrily: 1 repetitions" +- listitem: "they made: 1 repetitions" +- listitem: "This bunch: 1 repetitions" +- listitem: "past them: 1 repetitions" +- listitem: ", their: 1 repetitions" +- listitem: "the whisperers: 1 repetitions" +- listitem: "thought better: 1 repetitions" +- listitem: "the receiver: 1 repetitions" +- listitem: ", thinking: 1 repetitions" +- listitem: "seen the: 1 repetitions" +- listitem: "that ...: 1 repetitions" +- listitem: ", those: 1 repetitions" +- listitem: "those people: 1 repetitions" +- listitem: "the building: 1 repetitions" +- listitem: "worried that: 1 repetitions" +- listitem: "the tiny: 1 repetitions" +- listitem: "the contrary: 1 repetitions" +- listitem: "for nothing: 1 repetitions" +- listitem: "nothing could: 1 repetitions" +- listitem: "this happy: 1 repetitions" +- listitem: "the old: 1 repetitions" +- listitem: "also thought: 1 repetitions" +- listitem: "whatever that: 1 repetitions" +- listitem: "the driveway: 1 repetitions" +- listitem: "first thing: 1 repetitions" +- listitem: "thing he: 1 repetitions" +- listitem: "spotted that: 1 repetitions" +- listitem: "this normal: 1 repetitions" +- listitem: "himself together: 1 repetitions" +- listitem: "mention anything: 1 repetitions" +- listitem: "problems with: 1 repetitions" +- listitem: "catch the: 1 repetitions" +- listitem: "the evening: 1 repetitions" +- listitem: "reported that: 1 repetitions" +- listitem: "the nation: 1 repetitions" +- listitem: "Although owls: 1 repetitions" +- listitem: "there have: 1 repetitions" +- listitem: "these birds: 1 repetitions" +- listitem: "why the: 1 repetitions" +- listitem: "changed their: 1 repetitions" +- listitem: "their sleeping: 1 repetitions" +- listitem: "The newscaster: 1 repetitions" +- listitem: "McGuffin with: 1 repetitions" +- listitem: "the weather: 1 repetitions" +- listitem: "weather.: 1 repetitions" +- listitem: "weatherman: 1 repetitions" +- listitem: "the weatherman: 1 repetitions" +- listitem: "weatherman,: 1 repetitions" +- listitem: "owls that: 1 repetitions" +- listitem: "that have: 1 repetitions" +- listitem: "me that: 1 repetitions" +- listitem: "that instead: 1 repetitions" +- listitem: "the rain: 1 repetitions" +- listitem: "his throat: 1 repetitions" +- listitem: "throat nervously: 1 repetitions" +- listitem: "they normally: 1 repetitions" +- listitem: "and there: 1 repetitions" +- listitem: "just thought: 1 repetitions" +- listitem: "thought ...: 1 repetitions" +- listitem: "with ...: 1 repetitions" +- listitem: "whether: 1 repetitions" +- listitem: "tea through: 1 repetitions" +- listitem: "through pursed: 1 repetitions" +- listitem: "wondered whether: 1 repetitions" +- listitem: "whether he: 1 repetitions" +- listitem: "\"Their: 1 repetitions" +- listitem: "say another: 1 repetitions" +- listitem: "another word: 1 repetitions" +- listitem: "the subject: 1 repetitions" +- listitem: "the bathroom: 1 repetitions" +- listitem: "bathroom,: 1 repetitions" +- listitem: "the bedroom: 1 repetitions" +- listitem: "things?: 1 repetitions" +- listitem: "this have: 1 repetitions" +- listitem: "have anything: 1 repetitions" +- listitem: "comforting thought: 1 repetitions" +- listitem: "thought before: 1 repetitions" +- listitem: "for them: 1 repetitions" +- listitem: "them to: 1 repetitions" +- listitem: "Petunia thought: 1 repetitions" +- listitem: "thought about: 1 repetitions" +- listitem: "their kind: 1 repetitions" +- listitem: "that might: 1 repetitions" +- listitem: "affect them: 1 repetitions" +- listitem: "the far: 1 repetitions" +- listitem: "corner the: 1 repetitions" +- listitem: "have thought: 1 repetitions" +- listitem: "Nothing like: 1 repetitions" +- listitem: "thin,: 1 repetitions" +- listitem: "were both: 1 repetitions" +- listitem: "both long: 1 repetitions" +- listitem: "cloak that: 1 repetitions" +- listitem: "that swept: 1 repetitions" +- listitem: "swept the: 1 repetitions" +- listitem: "where everything: 1 repetitions" +- listitem: "everything from: 1 repetitions" +- listitem: "the sight: 1 repetitions" +- listitem: "clicked the: 1 repetitions" +- listitem: "the Put-Outer: 1 repetitions" +- listitem: "until the: 1 repetitions" +- listitem: "the distance: 1 repetitions" +- listitem: "the eyes: 1 repetitions" +- listitem: "their window: 1 repetitions" +- listitem: "they wouldn: 1 repetitions" +- listitem: "see anything: 1 repetitions" +- listitem: "the pavement: 1 repetitions" +- listitem: "slipped the: 1 repetitions" +- listitem: "the Put-: 1 repetitions" +- listitem: "rather severe-looking: 1 repetitions" +- listitem: "the shape: 1 repetitions" +- listitem: "the markings: 1 repetitions" +- listitem: "markings the: 1 repetitions" +- listitem: "d think: 1 repetitions" +- listitem: "even the: 1 repetitions" +- listitem: "something': 1 repetitions" +- listitem: "their news: 1 repetitions" +- listitem: "bet that: 1 repetitions" +- listitem: "blame them: 1 repetitions" +- listitem: "But that: 1 repetitions" +- listitem: "Muggle clothes: 1 repetitions" +- listitem: "clothes,: 1 repetitions" +- listitem: "She threw: 1 repetitions" +- listitem: "though hoping: 1 repetitions" +- listitem: "her something: 1 repetitions" +- listitem: "something,: 1 repetitions" +- listitem: "fine thing: 1 repetitions" +- listitem: "thing it: 1 repetitions" +- listitem: "be thankful: 1 repetitions" +- listitem: "thankful for: 1 repetitions" +- listitem: "m rather: 1 repetitions" +- listitem: "rather fond: 1 repetitions" +- listitem: "think this: 1 repetitions" +- listitem: "this You-: 1 repetitions" +- listitem: "use them: 1 repetitions" +- listitem: "are nothing: 1 repetitions" +- listitem: "nothing next: 1 repetitions" +- listitem: "rumors that: 1 repetitions" +- listitem: "that are: 1 repetitions" +- listitem: "neither: 1 repetitions" +- listitem: "seemed that: 1 repetitions" +- listitem: "that Professor: 1 repetitions" +- listitem: "for neither: 1 repetitions" +- listitem: "neither as: 1 repetitions" +- listitem: "Dumbledore with: 1 repetitions" +- listitem: "plain that: 1 repetitions" +- listitem: "that whatever: 1 repetitions" +- listitem: "choosing another: 1 repetitions" +- listitem: "another lemon: 1 repetitions" +- listitem: "that last: 1 repetitions" +- listitem: "that Lily: 1 repetitions" +- listitem: "the shoulder: 1 repetitions" +- listitem: "kill the: 1 repetitions" +- listitem: "kill that: 1 repetitions" +- listitem: "that little: 1 repetitions" +- listitem: "that when: 1 repetitions" +- listitem: "eyes beneath: 1 repetitions" +- listitem: "beneath her: 1 repetitions" +- listitem: "though,: 1 repetitions" +- listitem: "mean the: 1 repetitions" +- listitem: "watching them: 1 repetitions" +- listitem: "got this: 1 repetitions" +- listitem: "this son: 1 repetitions" +- listitem: "mother all: 1 repetitions" +- listitem: "explain everything: 1 repetitions" +- listitem: "everything to: 1 repetitions" +- listitem: "written them: 1 repetitions" +- listitem: "them a: 1 repetitions" +- listitem: "this in: 1 repetitions" +- listitem: "? These: 1 repetitions" +- listitem: "the future: 1 repetitions" +- listitem: "there will: 1 repetitions" +- listitem: "that until: 1 repetitions" +- listitem: "underneath: 1 repetitions" +- listitem: "her mouth: 1 repetitions" +- listitem: "she thought: 1 repetitions" +- listitem: "Harry underneath: 1 repetitions" +- listitem: "underneath it: 1 repetitions" +- listitem: "with something: 1 repetitions" +- listitem: "something as: 1 repetitions" +- listitem: "as this: 1 repetitions" +- listitem: "with my: 1 repetitions" +- listitem: "broken the: 1 repetitions" +- listitem: "the silence: 1 repetitions" +- listitem: "they looked: 1 repetitions" +- listitem: "they both: 1 repetitions" +- listitem: "both looked: 1 repetitions" +- listitem: "the sky: 1 repetitions" +- listitem: "leather: 1 repetitions" +- listitem: "nothing to: 1 repetitions" +- listitem: "hands the: 1 repetitions" +- listitem: "the size: 1 repetitions" +- listitem: "their leather: 1 repetitions" +- listitem: "leather boots: 1 repetitions" +- listitem: "that motorcycle: 1 repetitions" +- listitem: "forehead they: 1 repetitions" +- listitem: "that where: 1 repetitions" +- listitem: "have that: 1 repetitions" +- listitem: "that scar: 1 repetitions" +- listitem: "do something: 1 repetitions" +- listitem: "something about: 1 repetitions" +- listitem: "knee that: 1 repetitions" +- listitem: "that is: 1 repetitions" +- listitem: "the London: 1 repetitions" +- listitem: "this over: 1 repetitions" +- listitem: "over with: 1 repetitions" +- listitem: "with.: 1 repetitions" +- listitem: "with Muggles: 1 repetitions" +- listitem: "the arm: 1 repetitions" +- listitem: "then came: 1 repetitions" +- listitem: "other two: 1 repetitions" +- listitem: "minute the: 1 repetitions" +- listitem: "the three: 1 repetitions" +- listitem: "three of: 1 repetitions" +- listitem: "them stood: 1 repetitions" +- listitem: "the little: 1 repetitions" +- listitem: "the twinkling: 1 repetitions" +- listitem: "light that: 1 repetitions" +- listitem: "that usually: 1 repetitions" +- listitem: "join the: 1 repetitions" +- listitem: "the celebrations: 1 repetitions" +- listitem: "this bike: 1 repetitions" +- listitem: "kicked the: 1 repetitions" +- listitem: "the engine: 1 repetitions" +- listitem: "; with: 1 repetitions" +- listitem: "their street: 1 repetitions" +- listitem: "that Privet: 1 repetitions" +- listitem: "the step: 1 repetitions" +- listitem: "ruffled the: 1 repetitions" +- listitem: "the neat: 1 repetitions" +- listitem: "the inky: 1 repetitions" +- listitem: "astonishing things: 1 repetitions" +- listitem: "blankets without: 1 repetitions" +- listitem: "without waking: 1 repetitions" +- listitem: "the milk: 1 repetitions" +- listitem: "nor that: 1 repetitions" +- listitem: "that at: 1 repetitions" +- listitem: "this very: 1 repetitions" +- listitem: "up their: 1 repetitions" +- listitem: "their glasses: 1 repetitions" +- listitem: "THE VANASHIG: 1 repetitions" +- listitem: "since the: 1 repetitions" +- listitem: "find their: 1 repetitions" +- listitem: "their nephew: 1 repetitions" +- listitem: "The sun: 1 repetitions" +- listitem: "the brass: 1 repetitions" +- listitem: "into their: 1 repetitions" +- listitem: "their living: 1 repetitions" +- listitem: "seen that: 1 repetitions" +- listitem: "that fateful: 1 repetitions" +- listitem: "the mantelpiece: 1 repetitions" +- listitem: "now the: 1 repetitions" +- listitem: "the fair: 1 repetitions" +- listitem: "game with: 1 repetitions" +- listitem: "that another: 1 repetitions" +- listitem: "another boy: 1 repetitions" +- listitem: "made the: 1 repetitions" +- listitem: "woke with: 1 repetitions" +- listitem: "then the: 1 repetitions" +- listitem: "the frying: 1 repetitions" +- listitem: "the stove: 1 repetitions" +- listitem: "remember the: 1 repetitions" +- listitem: "the dream: 1 repetitions" +- listitem: "after the: 1 repetitions" +- listitem: "want everything: 1 repetitions" +- listitem: "everything perfect: 1 repetitions" +- listitem: "snapped through: 1 repetitions" +- listitem: "\"Nothing: 1 repetitions" +- listitem: "Nothing,: 1 repetitions" +- listitem: "nothing ...: 1 repetitions" +- listitem: "birthday —: 1 repetitions" +- listitem: "put them: 1 repetitions" +- listitem: "them on: 1 repetitions" +- listitem: "hidden beneath: 1 repetitions" +- listitem: "beneath all: 1 repetitions" +- listitem: "birthday presents: 1 repetitions" +- listitem: "though Dudley: 1 repetitions" +- listitem: "gotten the: 1 repetitions" +- listitem: "mention the: 1 repetitions" +- listitem: "had something: 1 repetitions" +- listitem: "with living: 1 repetitions" +- listitem: "skinnier than: 1 repetitions" +- listitem: "clothes of: 1 repetitions" +- listitem: "bigger than: 1 repetitions" +- listitem: "a thin: 1 repetitions" +- listitem: "thin face: 1 repetitions" +- listitem: "held together: 1 repetitions" +- listitem: "together with: 1 repetitions" +- listitem: "the nose: 1 repetitions" +- listitem: "thing Harry: 1 repetitions" +- listitem: "very thin: 1 repetitions" +- listitem: "thin scar: 1 repetitions" +- listitem: "forehead that: 1 repetitions" +- listitem: "life with: 1 repetitions" +- listitem: "entered the: 1 repetitions" +- listitem: "shouted that: 1 repetitions" +- listitem: "haircuts than: 1 repetitions" +- listitem: "than the: 1 repetitions" +- listitem: "put together: 1 repetitions" +- listitem: "grew that: 1 repetitions" +- listitem: "that way: 1 repetitions" +- listitem: "smoothly: 1 repetitions" +- listitem: "kitchen with: 1 repetitions" +- listitem: "thick blond: 1 repetitions" +- listitem: "hair that: 1 repetitions" +- listitem: "that lay: 1 repetitions" +- listitem: "lay smoothly: 1 repetitions" +- listitem: "smoothly on: 1 repetitions" +- listitem: "the plates: 1 repetitions" +- listitem: "as there: 1 repetitions" +- listitem: "Thirty-six: 1 repetitions" +- listitem: "\"Thirty-six: 1 repetitions" +- listitem: "Thirty-six,: 1 repetitions" +- listitem: "than last: 1 repetitions" +- listitem: "under this: 1 repetitions" +- listitem: "this big: 1 repetitions" +- listitem: "thirty-seven: 1 repetitions" +- listitem: ", thirty-seven: 1 repetitions" +- listitem: "thirty-seven then: 1 repetitions" +- listitem: "the face: 1 repetitions" +- listitem: "you another: 1 repetitions" +- listitem: "another two: 1 repetitions" +- listitem: "thought for: 1 repetitions" +- listitem: "have thirty: 1 repetitions" +- listitem: "... thirty: 1 repetitions" +- listitem: "Thirty-nine: 1 repetitions" +- listitem: "\"Thirty-nine: 1 repetitions" +- listitem: "Thirty-nine,: 1 repetitions" +- listitem: "right then: 1 repetitions" +- listitem: "s worth: 1 repetitions" +- listitem: "worth,: 1 repetitions" +- listitem: "moment the: 1 repetitions" +- listitem: "unwrap the: 1 repetitions" +- listitem: "ripping the: 1 repetitions" +- listitem: "the paper: 1 repetitions" +- listitem: "looking both: 1 repetitions" +- listitem: "both angry: 1 repetitions" +- listitem: "s mouth: 1 repetitions" +- listitem: "mouth fell: 1 repetitions" +- listitem: "birthday,: 1 repetitions" +- listitem: "or the: 1 repetitions" +- listitem: "the movies: 1 repetitions" +- listitem: "behind with: 1 repetitions" +- listitem: "with Mrs: 1 repetitions" +- listitem: "it there: 1 repetitions" +- listitem: "planned this: 1 repetitions" +- listitem: "sorry that: 1 repetitions" +- listitem: "that Mrs: 1 repetitions" +- listitem: "hates the: 1 repetitions" +- listitem: "t there: 1 repetitions" +- listitem: "there —: 1 repetitions" +- listitem: "or rather: 1 repetitions" +- listitem: "rather,: 1 repetitions" +- listitem: "nasty that: 1 repetitions" +- listitem: "that couldn: 1 repetitions" +- listitem: "understand them: 1 repetitions" +- listitem: "that if: 1 repetitions" +- listitem: "mother would: 1 repetitions" +- listitem: "him anything: 1 repetitions" +- listitem: "spoils everything: 1 repetitions" +- listitem: "everything!: 1 repetitions" +- listitem: "grin through: 1 repetitions" +- listitem: "mothers arms: 1 repetitions" +- listitem: "Just then: 1 repetitions" +- listitem: "the doorbell: 1 repetitions" +- listitem: "in with: 1 repetitions" +- listitem: "boy with: 1 repetitions" +- listitem: "usually the: 1 repetitions" +- listitem: "the one: 1 repetitions" +- listitem: "behind their: 1 repetitions" +- listitem: "their backs: 1 repetitions" +- listitem: "hit them: 1 repetitions" +- listitem: "car with: 1 repetitions" +- listitem: "with Piers: 1 repetitions" +- listitem: "of anything: 1 repetitions" +- listitem: "anything else: 1 repetitions" +- listitem: ", anything: 1 repetitions" +- listitem: "anything at: 1 repetitions" +- listitem: "that cupboard: 1 repetitions" +- listitem: "The problem: 1 repetitions" +- listitem: "strange things: 1 repetitions" +- listitem: "things often: 1 repetitions" +- listitem: "make them: 1 repetitions" +- listitem: "them happen: 1 repetitions" +- listitem: "the barbers: 1 repetitions" +- listitem: "hide that: 1 repetitions" +- listitem: "that horrible: 1 repetitions" +- listitem: "school the: 1 repetitions" +- listitem: "baggy clothes: 1 repetitions" +- listitem: "for this: 1 repetitions" +- listitem: "even though: 1 repetitions" +- listitem: "explain that: 1 repetitions" +- listitem: "Another time: 1 repetitions" +- listitem: "brown with: 1 repetitions" +- listitem: "with orange: 1 repetitions" +- listitem: "The harder: 1 repetitions" +- listitem: "the smaller: 1 repetitions" +- listitem: "the wash: 1 repetitions" +- listitem: "there he: 1 repetitions" +- listitem: "the chimney: 1 repetitions" +- listitem: "them Harry: 1 repetitions" +- listitem: "Vernon through: 1 repetitions" +- listitem: "the locked: 1 repetitions" +- listitem: "supposed that: 1 repetitions" +- listitem: "nothing was: 1 repetitions" +- listitem: "even worth: 1 repetitions" +- listitem: "worth being: 1 repetitions" +- listitem: "somewhere that: 1 repetitions" +- listitem: "that wasn: 1 repetitions" +- listitem: "about things: 1 repetitions" +- listitem: "things:: 1 repetitions" +- listitem: "the council: 1 repetitions" +- listitem: "the bank: 1 repetitions" +- listitem: "This morning: 1 repetitions" +- listitem: "the young: 1 repetitions" +- listitem: "overtook them: 1 repetitions" +- listitem: "beet with: 1 repetitions" +- listitem: "know they: 1 repetitions" +- listitem: "said anything: 1 repetitions" +- listitem: "If there: 1 repetitions" +- listitem: "thing the: 1 repetitions" +- listitem: "more than: 1 repetitions" +- listitem: "than his: 1 repetitions" +- listitem: "anything acting: 1 repetitions" +- listitem: "— they: 1 repetitions" +- listitem: "crowded with: 1 repetitions" +- listitem: "with families: 1 repetitions" +- listitem: "either: 1 repetitions" +- listitem: "the entrance: 1 repetitions" +- listitem: "the smiling: 1 repetitions" +- listitem: "the van: 1 repetitions" +- listitem: "they bought: 1 repetitions" +- listitem: ", either: 1 repetitions" +- listitem: "either,: 1 repetitions" +- listitem: "thought,: 1 repetitions" +- listitem: "they watched: 1 repetitions" +- listitem: "except that: 1 repetitions" +- listitem: "bored with: 1 repetitions" +- listitem: "the animals: 1 repetitions" +- listitem: "their favorite: 1 repetitions" +- listitem: "him another: 1 repetitions" +- listitem: "finish the: 1 repetitions" +- listitem: "pythons: 1 repetitions" +- listitem: "lunch they: 1 repetitions" +- listitem: "with lit: 1 repetitions" +- listitem: "along the: 1 repetitions" +- listitem: "and slithering: 1 repetitions" +- listitem: "slithering over: 1 repetitions" +- listitem: "man-crushing pythons: 1 repetitions" +- listitem: "pythons.: 1 repetitions" +- listitem: "the largest: 1 repetitions" +- listitem: "the mood: 1 repetitions" +- listitem: "stood with: 1 repetitions" +- listitem: "the glistening: 1 repetitions" +- listitem: "rapped the: 1 repetitions" +- listitem: "smartly with: 1 repetitions" +- listitem: "\"This: 1 repetitions" +- listitem: "the tank: 1 repetitions" +- listitem: "drumming their: 1 repetitions" +- listitem: "their fingers: 1 repetitions" +- listitem: "than having: 1 repetitions" +- listitem: "level with: 1 repetitions" +- listitem: ", then: 1 repetitions" +- listitem: "then raised: 1 repetitions" +- listitem: "look that: 1 repetitions" +- listitem: "murmured through: 1 repetitions" +- listitem: "nice there: 1 repetitions" +- listitem: ": This: 1 repetitions" +- listitem: "This specimen: 1 repetitions" +- listitem: "made both: 1 repetitions" +- listitem: "them jump: 1 repetitions" +- listitem: "THIS SNAKE: 1 repetitions" +- listitem: "toward them: 1 repetitions" +- listitem: "the ribs: 1 repetitions" +- listitem: "the concrete: 1 repetitions" +- listitem: "back with: 1 repetitions" +- listitem: "with howls: 1 repetitions" +- listitem: "throughout: 1 repetitions" +- listitem: ", slithering: 1 repetitions" +- listitem: "slithering out: 1 repetitions" +- listitem: "People throughout: 1 repetitions" +- listitem: "throughout the: 1 repetitions" +- listitem: "the exits: 1 repetitions" +- listitem: "Thanksss: 1 repetitions" +- listitem: "... Thanksss: 1 repetitions" +- listitem: "Thanksss,: 1 repetitions" +- listitem: "did the: 1 repetitions" +- listitem: "death: 1 repetitions" +- listitem: "done anything: 1 repetitions" +- listitem: "anything except: 1 repetitions" +- listitem: "at their: 1 repetitions" +- listitem: "their heels: 1 repetitions" +- listitem: "them how: 1 repetitions" +- listitem: "to death: 1 repetitions" +- listitem: "death.: 1 repetitions" +- listitem: "Until they: 1 repetitions" +- listitem: "the crash: 1 repetitions" +- listitem: "thought (: 1 repetitions" +- listitem: ") that: 1 repetitions" +- listitem: "that strangers: 1 repetitions" +- listitem: "strangers they: 1 repetitions" +- listitem: "shopping with: 1 repetitions" +- listitem: "with Aunt: 1 repetitions" +- listitem: "knew the: 1 repetitions" +- listitem: "rushed them: 1 repetitions" +- listitem: "them out: 1 repetitions" +- listitem: "the shop: 1 repetitions" +- listitem: "shop without: 1 repetitions" +- listitem: "without buying: 1 repetitions" +- listitem: "buying anything: 1 repetitions" +- listitem: "street the: 1 repetitions" +- listitem: "other day: 1 repetitions" +- listitem: "then walked: 1 repetitions" +- listitem: "away without: 1 repetitions" +- listitem: "The weirdest: 1 repetitions" +- listitem: "weirdest thing: 1 repetitions" +- listitem: "thing about: 1 repetitions" +- listitem: "way they: 1 repetitions" +- listitem: "vanish the: 1 repetitions" +- listitem: "hated that: 1 repetitions" +- listitem: "that odd: 1 repetitions" +- listitem: "disagree with: 1 repetitions" +- listitem: "The escape: 1 repetitions" +- listitem: "the Brazilian: 1 repetitions" +- listitem: "the summer: 1 repetitions" +- listitem: "the lot: 1 repetitions" +- listitem: "the leader: 1 repetitions" +- listitem: "them were: 1 repetitions" +- listitem: "and thinking: 1 repetitions" +- listitem: "the holidays: 1 repetitions" +- listitem: "going there: 1 repetitions" +- listitem: "there too: 1 repetitions" +- listitem: "the local: 1 repetitions" +- listitem: "\"They: 1 repetitions" +- listitem: "They stuff: 1 repetitions" +- listitem: "the toilet: 1 repetitions" +- listitem: "toilet the: 1 repetitions" +- listitem: "thanks,: 1 repetitions" +- listitem: "The poor: 1 repetitions" +- listitem: "had anything: 1 repetitions" +- listitem: "anything as: 1 repetitions" +- listitem: "cake that: 1 repetitions" +- listitem: "that tasted: 1 repetitions" +- listitem: "other while: 1 repetitions" +- listitem: "the teachers: 1 repetitions" +- listitem: "gruffly that: 1 repetitions" +- listitem: "the proudest: 1 repetitions" +- listitem: "thought two: 1 repetitions" +- listitem: "kitchen the: 1 repetitions" +- listitem: "the sink: 1 repetitions" +- listitem: "The tub: 1 repetitions" +- listitem: "s this: 1 repetitions" +- listitem: "they always: 1 repetitions" +- listitem: "the bowl: 1 repetitions" +- listitem: "old things: 1 repetitions" +- listitem: "things gray: 1 repetitions" +- listitem: "doubted this: 1 repetitions" +- listitem: "thought it: 1 repetitions" +- listitem: "both with: 1 repetitions" +- listitem: "with wrinkled: 1 repetitions" +- listitem: "the smell: 1 repetitions" +- listitem: "the click: 1 repetitions" +- listitem: "him with: 1 repetitions" +- listitem: "with your: 1 repetitions" +- listitem: "dodged the: 1 repetitions" +- listitem: ". Three: 1 repetitions" +- listitem: "Three things: 1 repetitions" +- listitem: "things lay: 1 repetitions" +- listitem: "the Isle: 1 repetitions" +- listitem: "envelope that: 1 repetitions" +- listitem: "no other: 1 repetitions" +- listitem: "other relatives: 1 repetitions" +- listitem: "the library: 1 repetitions" +- listitem: "plainly there: 1 repetitions" +- listitem: "there could: 1 repetitions" +- listitem: "was thick: 1 repetitions" +- listitem: "thick and: 1 repetitions" +- listitem: "Vernon the: 1 repetitions" +- listitem: "the yellow: 1 repetitions" +- listitem: "got something: 1 repetitions" +- listitem: "something!: 1 repetitions" +- listitem: "Within: 1 repetitions" +- listitem: "shaking the: 1 repetitions" +- listitem: "open with: 1 repetitions" +- listitem: "with one: 1 repetitions" +- listitem: "faster than: 1 repetitions" +- listitem: "than a: 1 repetitions" +- listitem: "stop there: 1 repetitions" +- listitem: ". Within: 1 repetitions" +- listitem: "Within seconds: 1 repetitions" +- listitem: "the grayish: 1 repetitions" +- listitem: "her throat: 1 repetitions" +- listitem: "throat and: 1 repetitions" +- listitem: "They stared: 1 repetitions" +- listitem: "other,: 1 repetitions" +- listitem: "father a: 1 repetitions" +- listitem: "head with: 1 repetitions" +- listitem: "read that: 1 repetitions" +- listitem: "stuffing the: 1 repetitions" +- listitem: "took both: 1 repetitions" +- listitem: "both Harry: 1 repetitions" +- listitem: "the scruffs: 1 repetitions" +- listitem: "threw them: 1 repetitions" +- listitem: "the keyhole: 1 repetitions" +- listitem: "could they: 1 repetitions" +- listitem: "they possibly: 1 repetitions" +- listitem: "them we: 1 repetitions" +- listitem: "that dangerous: 1 repetitions" +- listitem: "did something: 1 repetitions" +- listitem: "squeezed through: 1 repetitions" +- listitem: "then forced: 1 repetitions" +- listitem: "this cupboard: 1 repetitions" +- listitem: "we think: 1 repetitions" +- listitem: "Take this: 1 repetitions" +- listitem: "this stuff: 1 repetitions" +- listitem: "month-old: 1 repetitions" +- listitem: "the toys: 1 repetitions" +- listitem: "and things: 1 repetitions" +- listitem: "that wouldn: 1 repetitions" +- listitem: "move everything: 1 repetitions" +- listitem: "everything he: 1 repetitions" +- listitem: "to this: 1 repetitions" +- listitem: "this room: 1 repetitions" +- listitem: "Nearly everything: 1 repetitions" +- listitem: "everything in: 1 repetitions" +- listitem: "The month-old: 1 repetitions" +- listitem: "month-old video: 1 repetitions" +- listitem: "foot through: 1 repetitions" +- listitem: "through when: 1 repetitions" +- listitem: "; there: 1 repetitions" +- listitem: "parrot that: 1 repetitions" +- listitem: "shelf with: 1 repetitions" +- listitem: ". Other: 1 repetitions" +- listitem: "Other shelves: 1 repetitions" +- listitem: "things in: 1 repetitions" +- listitem: "room that: 1 repetitions" +- listitem: "though they: 1 repetitions" +- listitem: "came the: 1 repetitions" +- listitem: "there ...: 1 repetitions" +- listitem: "need that: 1 repetitions" +- listitem: "that room: 1 repetitions" +- listitem: "given anything: 1 repetitions" +- listitem: "d rather: 1 repetitions" +- listitem: "rather be: 1 repetitions" +- listitem: "cupboard with: 1 repetitions" +- listitem: "letter than: 1 repetitions" +- listitem: "than up: 1 repetitions" +- listitem: "here without: 1 repetitions" +- listitem: "without it: 1 repetitions" +- listitem: "thrown: 1 repetitions" +- listitem: "was rather: 1 repetitions" +- listitem: "rather quiet: 1 repetitions" +- listitem: "father with: 1 repetitions" +- listitem: "and thrown: 1 repetitions" +- listitem: "thrown his: 1 repetitions" +- listitem: "tortoise through: 1 repetitions" +- listitem: "the greenhouse: 1 repetitions" +- listitem: "was thinking: 1 repetitions" +- listitem: "other darkly: 1 repetitions" +- listitem: "banging things: 1 repetitions" +- listitem: "things with: 1 repetitions" +- listitem: "\"There: 1 repetitions" +- listitem: "s another: 1 repetitions" +- listitem: "The Smallest: 1 repetitions" +- listitem: "the fact: 1 repetitions" +- listitem: "fact that: 1 repetitions" +- listitem: "the neck: 1 repetitions" +- listitem: "for breath: 1 repetitions" +- listitem: "breath,: 1 repetitions" +- listitem: "that meant: 1 repetitions" +- listitem: "meant they: 1 repetitions" +- listitem: "sure they: 1 repetitions" +- listitem: "The repaired: 1 repetitions" +- listitem: "clock the: 1 repetitions" +- listitem: "downstairs without: 1 repetitions" +- listitem: "without turning: 1 repetitions" +- listitem: "the postman: 1 repetitions" +- listitem: "on something: 1 repetitions" +- listitem: "something big: 1 repetitions" +- listitem: "— something: 1 repetitions" +- listitem: "something alive: 1 repetitions" +- listitem: "squashy something: 1 repetitions" +- listitem: "something had: 1 repetitions" +- listitem: "the foot: 1 repetitions" +- listitem: "then told: 1 repetitions" +- listitem: "see three: 1 repetitions" +- listitem: "three letters: 1 repetitions" +- listitem: "tearing the: 1 repetitions" +- listitem: "work that: 1 repetitions" +- listitem: "a mouthful: 1 repetitions" +- listitem: "mouthful of: 1 repetitions" +- listitem: "they can: 1 repetitions" +- listitem: "deliver them: 1 repetitions" +- listitem: "them they: 1 repetitions" +- listitem: ", these: 1 repetitions" +- listitem: "nail with: 1 repetitions" +- listitem: "the piece: 1 repetitions" +- listitem: "than twelve: 1 repetitions" +- listitem: "go through: 1 repetitions" +- listitem: "slot they: 1 repetitions" +- listitem: "slotted through: 1 repetitions" +- listitem: "the sides: 1 repetitions" +- listitem: "forced through: 1 repetitions" +- listitem: "the small: 1 repetitions" +- listitem: "the downstairs: 1 repetitions" +- listitem: "downstairs bathroom: 1 repetitions" +- listitem: "bathroom.: 1 repetitions" +- listitem: "Tiptoe Through: 1 repetitions" +- listitem: "the Tulips: 1 repetitions" +- listitem: ", things: 1 repetitions" +- listitem: "things began: 1 repetitions" +- listitem: "found their: 1 repetitions" +- listitem: "the two: 1 repetitions" +- listitem: "eggs that: 1 repetitions" +- listitem: "that their: 1 repetitions" +- listitem: "their very: 1 repetitions" +- listitem: "the post: 1 repetitions" +- listitem: "the dairy: 1 repetitions" +- listitem: "shredded the: 1 repetitions" +- listitem: "earth: 1 repetitions" +- listitem: "on earth: 1 repetitions" +- listitem: "earth wants: 1 repetitions" +- listitem: "you this: 1 repetitions" +- listitem: "this badly: 1 repetitions" +- listitem: "the breakfast: 1 repetitions" +- listitem: "and rather: 1 repetitions" +- listitem: "rather ill: 1 repetitions" +- listitem: "reminded them: 1 repetitions" +- listitem: "them cheerfully: 1 repetitions" +- listitem: "Something came: 1 repetitions" +- listitem: ", thirty: 1 repetitions" +- listitem: "thirty or: 1 repetitions" +- listitem: "the waist: 1 repetitions" +- listitem: "threw him: 1 repetitions" +- listitem: "with their: 1 repetitions" +- listitem: "their arms: 1 repetitions" +- listitem: "over their: 1 repetitions" +- listitem: "hear the: 1 repetitions" +- listitem: "That does: 1 repetitions" +- listitem: "some clothes: 1 repetitions" +- listitem: "clothes.: 1 repetitions" +- listitem: "dangerous with: 1 repetitions" +- listitem: "with half: 1 repetitions" +- listitem: "missing that: 1 repetitions" +- listitem: "that no: 1 repetitions" +- listitem: "later they: 1 repetitions" +- listitem: "wrenched their: 1 repetitions" +- listitem: "way through: 1 repetitions" +- listitem: "the boarded-up: 1 repetitions" +- listitem: "the highway: 1 repetitions" +- listitem: "father had: 1 repetitions" +- listitem: "round the: 1 repetitions" +- listitem: "holding them: 1 repetitions" +- listitem: "them up: 1 repetitions" +- listitem: "where they: 1 repetitions" +- listitem: "then Uncle: 1 repetitions" +- listitem: "the opposite: 1 repetitions" +- listitem: "did this: 1 repetitions" +- listitem: "long without: 1 repetitions" +- listitem: "without blowing: 1 repetitions" +- listitem: "the outskirts: 1 repetitions" +- listitem: "room with: 1 repetitions" +- listitem: "with twin: 1 repetitions" +- listitem: "the windowsill: 1 repetitions" +- listitem: "breakfast the: 1 repetitions" +- listitem: "the owner: 1 repetitions" +- listitem: "the hotel: 1 repetitions" +- listitem: "their table: 1 repetitions" +- listitem: "these at: 1 repetitions" +- listitem: "so they: 1 repetitions" +- listitem: "Cokeworth: 1 repetitions" +- listitem: "The woman: 1 repetitions" +- listitem: "take them: 1 repetitions" +- listitem: "the dining: 1 repetitions" +- listitem: "them knew: 1 repetitions" +- listitem: "drove them: 1 repetitions" +- listitem: "off they: 1 repetitions" +- listitem: "same thing: 1 repetitions" +- listitem: "late that: 1 repetitions" +- listitem: "the coast: 1 repetitions" +- listitem: "locked them: 1 repetitions" +- listitem: "somewhere with: 1 repetitions" +- listitem: "eleventh: 1 repetitions" +- listitem: "This reminded: 1 repetitions" +- listitem: "know the: 1 repetitions" +- listitem: "the week: 1 repetitions" +- listitem: "then tomorrow: 1 repetitions" +- listitem: "s eleventh: 1 repetitions" +- listitem: "eleventh birthday: 1 repetitions" +- listitem: "birthdays were: 1 repetitions" +- listitem: "the perfect: 1 repetitions" +- listitem: "the most: 1 repetitions" +- listitem: "thing was: 1 repetitions" +- listitem: "this gentleman: 1 repetitions" +- listitem: "toothless: 1 repetitions" +- listitem: "A toothless: 1 repetitions" +- listitem: "toothless old: 1 repetitions" +- listitem: "rather wicked: 1 repetitions" +- listitem: "the iron-gray: 1 repetitions" +- listitem: "below them: 1 repetitions" +- listitem: "the boat: 1 repetitions" +- listitem: "down their: 1 repetitions" +- listitem: "whipped their: 1 repetitions" +- listitem: "hours they: 1 repetitions" +- listitem: "they reached: 1 repetitions" +- listitem: "led the: 1 repetitions" +- listitem: "the broken-down: 1 repetitions" +- listitem: "The inside: 1 repetitions" +- listitem: "whistled through: 1 repetitions" +- listitem: "the wooden: 1 repetitions" +- listitem: "with some: 1 repetitions" +- listitem: "of those: 1 repetitions" +- listitem: "thought nobody: 1 repetitions" +- listitem: "reaching them: 1 repetitions" +- listitem: "them here: 1 repetitions" +- listitem: "though the: 1 repetitions" +- listitem: "the thought: 1 repetitions" +- listitem: "thought didn: 1 repetitions" +- listitem: "filthy: 1 repetitions" +- listitem: "moth-eaten: 1 repetitions" +- listitem: "thinnest: 1 repetitions" +- listitem: "the promised: 1 repetitions" +- listitem: "the high: 1 repetitions" +- listitem: "splattered the: 1 repetitions" +- listitem: "rattled the: 1 repetitions" +- listitem: "the filthy: 1 repetitions" +- listitem: "filthy windows: 1 repetitions" +- listitem: "the moth-eaten: 1 repetitions" +- listitem: "moth-eaten sofa: 1 repetitions" +- listitem: "the lumpy: 1 repetitions" +- listitem: "the softest: 1 repetitions" +- listitem: "the thinnest: 1 repetitions" +- listitem: "thinnest,: 1 repetitions" +- listitem: "rumbling with: 1 repetitions" +- listitem: "with hunger: 1 repetitions" +- listitem: "of thunder: 1 repetitions" +- listitem: "thunder that: 1 repetitions" +- listitem: "that started: 1 repetitions" +- listitem: "birthday tick: 1 repetitions" +- listitem: "heard something: 1 repetitions" +- listitem: "something creak: 1 repetitions" +- listitem: "hoped the: 1 repetitions" +- listitem: "Maybe the: 1 repetitions" +- listitem: "when they: 1 repetitions" +- listitem: "back that: 1 repetitions" +- listitem: "Three minutes: 1 repetitions" +- listitem: "that funny: 1 repetitions" +- listitem: ". Thirty: 1 repetitions" +- listitem: "Thirty seconds: 1 repetitions" +- listitem: "— three: 1 repetitions" +- listitem: "three ...: 1 repetitions" +- listitem: "THE KEYS: 1 repetitions" +- listitem: "They knocked: 1 repetitions" +- listitem: "the cannon: 1 repetitions" +- listitem: "now they: 1 repetitions" +- listitem: "they knew: 1 repetitions" +- listitem: "the long: 1 repetitions" +- listitem: "brought with: 1 repetitions" +- listitem: "with them: 1 repetitions" +- listitem: "s there: 1 repetitions" +- listitem: "hit with: 1 repetitions" +- listitem: "force that: 1 repetitions" +- listitem: "the doorway: 1 repetitions" +- listitem: "the hair: 1 repetitions" +- listitem: "that his: 1 repetitions" +- listitem: "brushed the: 1 repetitions" +- listitem: "The noise: 1 repetitions" +- listitem: "at them: 1 repetitions" +- listitem: "frozen with: 1 repetitions" +- listitem: "with fear: 1 repetitions" +- listitem: "the stranger: 1 repetitions" +- listitem: "the fierce: 1 repetitions" +- listitem: "the beetle: 1 repetitions" +- listitem: "demand that: 1 repetitions" +- listitem: "jerked the: 1 repetitions" +- listitem: "the gun: 1 repetitions" +- listitem: "made another: 1 repetitions" +- listitem: "another funny: 1 repetitions" +- listitem: "birthday to: 1 repetitions" +- listitem: "it with: 1 repetitions" +- listitem: "with trembling: 1 repetitions" +- listitem: "cake with: 1 repetitions" +- listitem: "with Happy: 1 repetitions" +- listitem: "Birthday Harry: 1 repetitions" +- listitem: "say thank: 1 repetitions" +- listitem: "the words: 1 repetitions" +- listitem: "that tea: 1 repetitions" +- listitem: "tea then: 1 repetitions" +- listitem: "bath: 1 repetitions" +- listitem: "grate with: 1 repetitions" +- listitem: "the shriveled: 1 repetitions" +- listitem: "fire there: 1 repetitions" +- listitem: "hut with: 1 repetitions" +- listitem: "with flickering: 1 repetitions" +- listitem: "felt the: 1 repetitions" +- listitem: "the warmth: 1 repetitions" +- listitem: "warmth wash: 1 repetitions" +- listitem: "hot bath: 1 repetitions" +- listitem: "bath.: 1 repetitions" +- listitem: "of things: 1 repetitions" +- listitem: "things out: 1 repetitions" +- listitem: "liquid that: 1 repetitions" +- listitem: "Soon the: 1 repetitions" +- listitem: "a thing: 1 repetitions" +- listitem: "thing while: 1 repetitions" +- listitem: "slid the: 1 repetitions" +- listitem: "the poker: 1 repetitions" +- listitem: "touch anything: 1 repetitions" +- listitem: "passed the: 1 repetitions" +- listitem: "the sausages: 1 repetitions" +- listitem: "tasted anything: 1 repetitions" +- listitem: "anything so: 1 repetitions" +- listitem: "explain anything: 1 repetitions" +- listitem: "mouth with: 1 repetitions" +- listitem: "the shadows: 1 repetitions" +- listitem: "never thought: 1 repetitions" +- listitem: "thought yeh: 1 repetitions" +- listitem: "Hagrid thundered: 1 repetitions" +- listitem: "thundered.: 1 repetitions" +- listitem: "nothin: 1 repetitions" +- listitem: "knows nothin: 1 repetitions" +- listitem: "nothin': 1 repetitions" +- listitem: "ANYTHING?: 1 repetitions" +- listitem: "math: 1 repetitions" +- listitem: "some things: 1 repetitions" +- listitem: "do math: 1 repetitions" +- listitem: "math and: 1 repetitions" +- listitem: "whispered something: 1 repetitions" +- listitem: "something that: 1 repetitions" +- listitem: "that sounded: 1 repetitions" +- listitem: "were they: 1 repetitions" +- listitem: "they?: 1 repetitions" +- listitem: "fingers through: 1 repetitions" +- listitem: "through his: 1 repetitions" +- listitem: "right there: 1 repetitions" +- listitem: "boy anything: 1 repetitions" +- listitem: "anything!: 1 repetitions" +- listitem: "man than: 1 repetitions" +- listitem: "than Vernon: 1 repetitions" +- listitem: "the furious: 1 repetitions" +- listitem: "trembled with: 1 repetitions" +- listitem: "with rage: 1 repetitions" +- listitem: "was there: 1 repetitions" +- listitem: "there!: 1 repetitions" +- listitem: "these years: 1 repetitions" +- listitem: "the whistling: 1 repetitions" +- listitem: "thumpin: 1 repetitions" +- listitem: "a thumpin: 1 repetitions" +- listitem: "thumpin': 1 repetitions" +- listitem: "Hut-on-the-Rock: 1 repetitions" +- listitem: "take the: 1 repetitions" +- listitem: "the yellowish: 1 repetitions" +- listitem: ", Hut-on-the-Rock: 1 repetitions" +- listitem: "Hut-on-the-Rock,: 1 repetitions" +- listitem: "you that: 1 repetitions" +- listitem: "later than: 1 repetitions" +- listitem: "than July: 1 repetitions" +- listitem: "they await: 1 repetitions" +- listitem: "teeth: 1 repetitions" +- listitem: "that reminds: 1 repetitions" +- listitem: "forehead with: 1 repetitions" +- listitem: "with enough: 1 repetitions" +- listitem: "yet another: 1 repetitions" +- listitem: "another pocket: 1 repetitions" +- listitem: ", rather: 1 repetitions" +- listitem: "rather ruffled-looking: 1 repetitions" +- listitem: "his teeth: 1 repetitions" +- listitem: "teeth he: 1 repetitions" +- listitem: "note that: 1 repetitions" +- listitem: "his things: 1 repetitions" +- listitem: "things tomorrow: 1 repetitions" +- listitem: "Weather': 1 repetitions" +- listitem: "the note: 1 repetitions" +- listitem: "threw the: 1 repetitions" +- listitem: "though this: 1 repetitions" +- listitem: "mouth was: 1 repetitions" +- listitem: "the firelight: 1 repetitions" +- listitem: "like them: 1 repetitions" +- listitem: "that rubbish: 1 repetitions" +- listitem: "that and: 1 repetitions" +- listitem: "that —: 1 repetitions" +- listitem: "that school: 1 repetitions" +- listitem: "vacation with: 1 repetitions" +- listitem: "my mother: 1 repetitions" +- listitem: "Lily this: 1 repetitions" +- listitem: "this and: 1 repetitions" +- listitem: "Lily that: 1 repetitions" +- listitem: "then went: 1 repetitions" +- listitem: "this for: 1 repetitions" +- listitem: "Then she: 1 repetitions" +- listitem: "met that: 1 repetitions" +- listitem: "that Potter: 1 repetitions" +- listitem: "they left: 1 repetitions" +- listitem: "just the: 1 repetitions" +- listitem: "landed with: 1 repetitions" +- listitem: "with you: 1 repetitions" +- listitem: "me they: 1 repetitions" +- listitem: "they died: 1 repetitions" +- listitem: "angrily that: 1 repetitions" +- listitem: "their corner: 1 repetitions" +- listitem: "The anger: 1 repetitions" +- listitem: "expected this: 1 repetitions" +- listitem: "me there: 1 repetitions" +- listitem: "there might: 1 repetitions" +- listitem: "m the: 1 repetitions" +- listitem: "He threw: 1 repetitions" +- listitem: "everythin: 1 repetitions" +- listitem: "yeh everythin: 1 repetitions" +- listitem: "everythin': 1 repetitions" +- listitem: "with —: 1 repetitions" +- listitem: "— with: 1 repetitions" +- listitem: "than worse: 1 repetitions" +- listitem: "this —: 1 repetitions" +- listitem: "friendly with: 1 repetitions" +- listitem: "with strange: 1 repetitions" +- listitem: "terrible things: 1 repetitions" +- listitem: "anythin: 1 repetitions" +- listitem: "their day: 1 repetitions" +- listitem: "Suppose the: 1 repetitions" +- listitem: "the myst: 1 repetitions" +- listitem: "want anythin: 1 repetitions" +- listitem: "anythin': 1 repetitions" +- listitem: "outta the: 1 repetitions" +- listitem: "the village: 1 repetitions" +- listitem: "nose with: 1 repetitions" +- listitem: "that sad: 1 repetitions" +- listitem: "' this: 1 repetitions" +- listitem: "thing —: 1 repetitions" +- listitem: "by then: 1 repetitions" +- listitem: "got that: 1 repetitions" +- listitem: "that mark: 1 repetitions" +- listitem: "? That: 1 repetitions" +- listitem: "the age: 1 repetitions" +- listitem: "the McKinnons: 1 repetitions" +- listitem: "the Bones: 1 repetitions" +- listitem: "the Prewetts: 1 repetitions" +- listitem: "again the: 1 repetitions" +- listitem: "the blinding: 1 repetitions" +- listitem: "clearly than: 1 repetitions" +- listitem: "remembered something: 1 repetitions" +- listitem: "the ruined: 1 repetitions" +- listitem: "ter this: 1 repetitions" +- listitem: "this lot: 1 repetitions" +- listitem: "accept there: 1 repetitions" +- listitem: "s something: 1 repetitions" +- listitem: "something strange: 1 repetitions" +- listitem: "nothing a: 1 repetitions" +- listitem: "this about: 1 repetitions" +- listitem: "off without: 1 repetitions" +- listitem: "without them: 1 repetitions" +- listitem: "all they: 1 repetitions" +- listitem: "with these: 1 repetitions" +- listitem: "these wizarding: 1 repetitions" +- listitem: "Pointing this: 1 repetitions" +- listitem: "this at: 1 repetitions" +- listitem: ", breathing: 1 repetitions" +- listitem: "breathing heavily: 1 repetitions" +- listitem: "which this: 1 repetitions" +- listitem: "reckon they: 1 repetitions" +- listitem: "there somewhere: 1 repetitions" +- listitem: "Cause somethin: 1 repetitions" +- listitem: "was somethin: 1 repetitions" +- listitem: "on that: 1 repetitions" +- listitem: "that night: 1 repetitions" +- listitem: "but somethin: 1 repetitions" +- listitem: "with warmth: 1 repetitions" +- listitem: "warmth and: 1 repetitions" +- listitem: "t they: 1 repetitions" +- listitem: "they been: 1 repetitions" +- listitem: "defeated the: 1 repetitions" +- listitem: "made things: 1 repetitions" +- listitem: "odd thing: 1 repetitions" +- listitem: "that had: 1 repetitions" +- listitem: "furious with: 1 repetitions" +- listitem: "their reach: 1 repetitions" +- listitem: "school with: 1 repetitions" +- listitem: "that ridiculous: 1 repetitions" +- listitem: ", without: 1 repetitions" +- listitem: "without even: 1 repetitions" +- listitem: "that Hagrid: 1 repetitions" +- listitem: "in without: 1 repetitions" +- listitem: "read those: 1 repetitions" +- listitem: "ter the: 1 repetitions" +- listitem: "the finest: 1 repetitions" +- listitem: "years there: 1 repetitions" +- listitem: "there and: 1 repetitions" +- listitem: "with youngsters: 1 repetitions" +- listitem: "he thundered: 1 repetitions" +- listitem: "thundered,: 1 repetitions" +- listitem: "brought the: 1 repetitions" +- listitem: "the umbrella: 1 repetitions" +- listitem: "down through: 1 repetitions" +- listitem: "spot with: 1 repetitions" +- listitem: "on them: 1 repetitions" +- listitem: "poking through: 1 repetitions" +- listitem: "other room: 1 repetitions" +- listitem: "anyway there: 1 repetitions" +- listitem: "mention that: 1 repetitions" +- listitem: "that ter: 1 repetitions" +- listitem: "the reasons: 1 repetitions" +- listitem: "the job: 1 repetitions" +- listitem: "truth: 1 repetitions" +- listitem: "third: 1 repetitions" +- listitem: "yeh the: 1 repetitions" +- listitem: "the truth: 1 repetitions" +- listitem: "truth.: 1 repetitions" +- listitem: "me third: 1 repetitions" +- listitem: "third year: 1 repetitions" +- listitem: "They snapped: 1 repetitions" +- listitem: "' everything: 1 repetitions" +- listitem: "everything.: 1 repetitions" +- listitem: "thick black: 1 repetitions" +- listitem: "under that: 1 repetitions" +- listitem: "early the: 1 repetitions" +- text: "/the Dursleys : \\d+ repetitions/" +- table /id-table-\d+-nth/: + - rowgroup: + - row /id-table-\d+-row-0-nth/: + - cell /id-table-\d+-row-0-nth-link/ + - row /id-table-\d+-row-1-nth/: + - cell /id-table-\d+-row-1-nth-link/ + - row /id-table-\d+-row-2-nth/: + - cell /id-table-\d+-row-2-nth-link/: to be. The Dursleys shuddered + - row /id-table-\d+-row-3-nth/: + - cell /id-table-\d+-row-3-nth-link/: street. The Dursleys knew that + - row /id-table-\d+-row-4-nth/: + - cell /id-table-\d+-row-4-nth-link/ + - row /id-table-\d+-row-5-nth/: + - cell /id-table-\d+-row-5-nth-link/: back at the Dursleys' dark + - row /id-table-\d+-row-6-nth/: + - cell /id-table-\d+-row-6-nth-link/ + - row /id-table-\d+-row-7-nth/: + - cell /id-table-\d+-row-7-nth-link/: since the Dursleys had woken + - row /id-table-\d+-row-8-nth/: + - cell /id-table-\d+-row-8-nth-link/: four on the Dursleys' front + - row /id-table-\d+-row-9-nth/: + - cell /id-table-\d+-row-9-nth-link/ + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/ + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/: back of the Dursleys' car with + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/: telling the Dursleys he didn't + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/ + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/: one thing the Dursleys hated + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/: families. The Dursleys bought + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/ + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/ + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/ + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/: happened; the Dursleys were his + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/ + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/: wake the Dursleys. He stole + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/: bullets. The Dursleys ducked, + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/: year, the Dursleys had given + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/ + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/: back on the Dursleys, "a very + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/ + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/ + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/ + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/ + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/ + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/ \ No newline at end of file diff --git a/static/tests/test-classic-desktop-1-lite.koboldai.net.spec.ts b/static/tests/test-classic-desktop-1-lite.koboldai.net.spec.ts index b0678e5ee1cae430efa4ae6bbf19c7fba0da10b1..449ddc45efc84844d7291b73739e8a81c9898063 100644 --- a/static/tests/test-classic-desktop-1-lite.koboldai.net.spec.ts +++ b/static/tests/test-classic-desktop-1-lite.koboldai.net.spec.ts @@ -10,6 +10,7 @@ * 6. Assert correct UI updates and ARIA snapshots for accessibility. */ import { test, expect } from '@playwright/test'; +import { uploadFileWithPageAndFilepath } from './test-helper'; const testStoryJsonTxt = `${import.meta.dirname}/../../tests/events/very_long_text.json` const orderSelectionValues = ["asc", "desc"] @@ -23,15 +24,7 @@ test('test My Ghost Writer, desktop: order/sort', async ({ page }) => { await page.getByRole('button', { name: 'Set UI' }).click(); // 3. Upload a saved JSON story file to provide long text content for analysis - console.log(`preparing uploading of file '${testStoryJsonTxt}'!`) - await page.getByRole('link', { name: 'Save / Load' }).click(); - await page.waitForTimeout(100) - const fileChooserPromise = page.waitForEvent('filechooser'); - await page.getByRole('button', { name: '📁 Open File' }).click(); - const fileChooser = await fileChooserPromise; - await fileChooser.setFiles(testStoryJsonTxt); - await page.waitForTimeout(300) - console.log(`file '${testStoryJsonTxt}' uploaded!`) + await uploadFileWithPageAndFilepath(page, testStoryJsonTxt) // 4. Activate "My Ghost Writer" / text stats functionality via settings await page.getByRole('link', { name: 'Settings' }).click(); @@ -74,7 +67,7 @@ test('test My Ghost Writer, desktop: order/sort', async ({ page }) => { await page.getByRole('searchbox', { name: 'filter-words-frequency' }).press('Enter'); await page.waitForTimeout(300) // Assert that the list of words container matches the expected ARIA snapshot for this combination - await expect(page.getByLabel('id-list-of-words-container')).toMatchAriaSnapshot({ name: `test-classic-1--${currentOrderSelectionValue}-${currentSortSelectionValue}.txt` }); + await expect(page.getByLabel('id-list-of-words-container')).toMatchAriaSnapshot({ name: `test-classic-desktop-1--${currentOrderSelectionValue}-${currentSortSelectionValue}--id-list-of-words-container.txt` }); } } // End of test diff --git a/static/tests/test-classic-desktop-1-lite.koboldai.net.spec.ts-snapshots/test-classic-1--asc-count.txt b/static/tests/test-classic-desktop-1-lite.koboldai.net.spec.ts-snapshots/test-classic-desktop-1--asc-count--id-list-of-words-container.txt similarity index 100% rename from static/tests/test-classic-desktop-1-lite.koboldai.net.spec.ts-snapshots/test-classic-1--asc-count.txt rename to static/tests/test-classic-desktop-1-lite.koboldai.net.spec.ts-snapshots/test-classic-desktop-1--asc-count--id-list-of-words-container.txt diff --git a/static/tests/test-classic-desktop-1-lite.koboldai.net.spec.ts-snapshots/test-classic-1--asc-n-words-ngram.txt b/static/tests/test-classic-desktop-1-lite.koboldai.net.spec.ts-snapshots/test-classic-desktop-1--asc-n-words-ngram--id-list-of-words-container.txt similarity index 100% rename from static/tests/test-classic-desktop-1-lite.koboldai.net.spec.ts-snapshots/test-classic-1--asc-n-words-ngram.txt rename to static/tests/test-classic-desktop-1-lite.koboldai.net.spec.ts-snapshots/test-classic-desktop-1--asc-n-words-ngram--id-list-of-words-container.txt diff --git a/static/tests/test-classic-desktop-1-lite.koboldai.net.spec.ts-snapshots/test-classic-1--asc-word-prefix.txt b/static/tests/test-classic-desktop-1-lite.koboldai.net.spec.ts-snapshots/test-classic-desktop-1--asc-word-prefix--id-list-of-words-container.txt similarity index 100% rename from static/tests/test-classic-desktop-1-lite.koboldai.net.spec.ts-snapshots/test-classic-1--asc-word-prefix.txt rename to static/tests/test-classic-desktop-1-lite.koboldai.net.spec.ts-snapshots/test-classic-desktop-1--asc-word-prefix--id-list-of-words-container.txt diff --git a/static/tests/test-classic-desktop-1-lite.koboldai.net.spec.ts-snapshots/test-classic-1--desc-count.txt b/static/tests/test-classic-desktop-1-lite.koboldai.net.spec.ts-snapshots/test-classic-desktop-1--desc-count--id-list-of-words-container.txt similarity index 100% rename from static/tests/test-classic-desktop-1-lite.koboldai.net.spec.ts-snapshots/test-classic-1--desc-count.txt rename to static/tests/test-classic-desktop-1-lite.koboldai.net.spec.ts-snapshots/test-classic-desktop-1--desc-count--id-list-of-words-container.txt diff --git a/static/tests/test-classic-desktop-1-lite.koboldai.net.spec.ts-snapshots/test-classic-1--desc-n-words-ngram.txt b/static/tests/test-classic-desktop-1-lite.koboldai.net.spec.ts-snapshots/test-classic-desktop-1--desc-n-words-ngram--id-list-of-words-container.txt similarity index 100% rename from static/tests/test-classic-desktop-1-lite.koboldai.net.spec.ts-snapshots/test-classic-1--desc-n-words-ngram.txt rename to static/tests/test-classic-desktop-1-lite.koboldai.net.spec.ts-snapshots/test-classic-desktop-1--desc-n-words-ngram--id-list-of-words-container.txt diff --git a/static/tests/test-classic-desktop-1-lite.koboldai.net.spec.ts-snapshots/test-classic-1--desc-word-prefix.txt b/static/tests/test-classic-desktop-1-lite.koboldai.net.spec.ts-snapshots/test-classic-desktop-1--desc-word-prefix--id-list-of-words-container.txt similarity index 100% rename from static/tests/test-classic-desktop-1-lite.koboldai.net.spec.ts-snapshots/test-classic-1--desc-word-prefix.txt rename to static/tests/test-classic-desktop-1-lite.koboldai.net.spec.ts-snapshots/test-classic-desktop-1--desc-word-prefix--id-list-of-words-container.txt diff --git a/static/tests/test-classic-desktop-3-lite.koboldai.net.spec.ts b/static/tests/test-classic-desktop-3-lite.koboldai.net.spec.ts index 25b287f3c5f7d1d246a9d0375dc3456793ab20fd..273d22b278f64e887211694e9f7db3256e89651e 100644 --- a/static/tests/test-classic-desktop-3-lite.koboldai.net.spec.ts +++ b/static/tests/test-classic-desktop-3-lite.koboldai.net.spec.ts @@ -10,7 +10,7 @@ * 6. Navigate between value list and tables, and assert correct UI updates and ARIA snapshots for accessibility. */ import { test, expect, Page } from '@playwright/test'; -import { assertCellAndLink, expectOnlyVisibleTextInElement } from './test-helper' +import { expectOnlyVisibleTextInElement, uploadFileWithPageAndFilepath } from './test-helper' const testStoryJsonTxt = `${import.meta.dirname}/../../tests/events/very_long_text.json` @@ -25,15 +25,7 @@ test('test My Ghost Writer, desktop: try using My Ghost Writer with Aesthetic UI await page.getByRole('button', { name: 'Set UI' }).click(); // 3. Upload a saved JSON story file to provide long text content for analysis - console.log(`preparing uploading of file '${testStoryJsonTxt}'!`) - await page.getByRole('link', { name: 'Save / Load' }).click(); - await page.waitForTimeout(100) - const fileChooserPromise = page.waitForEvent('filechooser'); - await page.getByRole('button', { name: '📁 Open File' }).click(); - const fileChooser = await fileChooserPromise; - await fileChooser.setFiles(testStoryJsonTxt); - await page.waitForTimeout(300) - console.log(`file '${testStoryJsonTxt}' uploaded!`) + await uploadFileWithPageAndFilepath(page, testStoryJsonTxt) // 4. Open settings and enable the "My Ghost Writer" text stats feature await page.getByRole('link', { name: 'Settings' }).click(); diff --git a/static/tests/test-classic-ipad-mini-0-lite.koboldai.net.spec.ts b/static/tests/test-classic-ipad-mini-0-lite.koboldai.net.spec.ts index 81826c18eebd80b7730bd1a90f91d049b7ac8a8a..a85631ad2a091ab75eb0e8574a096dec6aac7b1b 100644 --- a/static/tests/test-classic-ipad-mini-0-lite.koboldai.net.spec.ts +++ b/static/tests/test-classic-ipad-mini-0-lite.koboldai.net.spec.ts @@ -1,21 +1,18 @@ import { test, expect } from '@playwright/test'; -import { assertCellAndLink } from './test-helper' +import { assertCellAndLinkAriaSnapshot, uploadFileWithPageAndFilepath } from './test-helper' const testStoryJsonTxt = `${import.meta.dirname}/../../tests/events/very_long_text.json` - +const expectedStringArray = [ + "THE BOY WHO LIVEDMr. and Mrs. Dursley, of number four, Privet Drive, were proud to say that they were perfectly normal, thank you very much. They were the last people you'd expect to be involved in anything strange or mysterious, because they just didn't hold with such nonsense.Mr. Dursley was the director of a firm called Grunnings, which made drills. He was a big, beefy man with hardly any neck, although he did have a very large mustache. Mrs. Dursley was thin and blonde and had nearly twice the usual amount of neck, which came in very useful as she spent so much of her time craning over garden fences, spying on the neighbors. The Dursley s had a small son called Dudley and in their opinion there was no finer boy anywhere.The Dursleys had everything they wanted, but they also had a secret, and their greatest fear was that somebody would discover it. They didn't think they could bear it if anyone found out about the Potters. Mrs. Potter was Mrs. Dursley's sister, but they hadn'tmet for several years; in fact, Mrs. Dursley pretended she didn't have a sister, because her sister and her good-for-nothing husband were as unDursleyish as it was possible to be. The Dursleys shuddered to think what the neighbors would say if the Potters arrived in the street. The Dursleys knew that the Potters had a small son, too, but they had never even seen him.This boy was another good reason for keeping the Potters away; they didn't want Dudley mixing with a child like that.When Mr. and Mrs. Dursley woke up on the dull, gray Tuesday our story starts, there was nothing about the cloudy sky outside to suggest that strange and mysterious things would soon be happening all over the country. Mr. Dursley hummed as he picked out his most boring tie for work, and Mrs. Dursley gossiped away happily as she wrestled a screaming Dudley into his high chair.", + "the next second, Dudley was dancing on the spot with his hands clasped over his fat bottom, howling in pain. When he turned his back on them, Harry saw a curly pig's tail poking through a hole in his trousers.Uncle Vernon roared. Pulling Aunt Petunia and Dudley into the other room, he cast one last terrified look at Hagrid and slammed the door behind them.Hagrid looked down at his umbrella and stroked his beard.\"Shouldn'ta lost me temper,\" he said ruefully, \"but it didn't work anyway. Meant ter turn him into a pig, but I suppose he was so much like a pig anyway there wasn't much left ter do.\"He cast a sideways look at Harry under his bushy eyebrows.\"Be grateful if yeh didn't mention that ter anyone at Hogwarts,\" he said. \"I'm — er — not supposed ter do magic, strictly speakin'. I was allowed ter do a bit ter follow yeh an' get yer letters to yeh an' stuff — one o' the reasons I was so keen ter take on the job — \"\"Why aren't you supposed to do magic?\" asked Harry.\"Oh, well — I was at Hogwarts meself but I — er — got expelled, ter tell yeh the truth. In me third year. They snapped me wand in half an' everything. But Dumbledore let me stay on as gamekeeper. Great man, Dumbledore.\"\"Why were you expelled?\"\"It's gettin' late and we've got lots ter do tomorrow,\" said Hagrid loudly. \"Gotta get up ter town, get all yer books an' that.\"He took off his thick black coat and threw it to Harry.\"You can kip under that,\" he said. \"Don' mind if it wriggles a bit, I think I still got a couple o' dormice in one o' the pockets.\"Harry woke early the next morning. Although he could", + "Mr. and Mrs. Dursley, of number four, Privet Drive, were proud to say that they were perfectly normal, thank you very much. They were the last people you'd expect to be involved in anything strange or mysterious, because they just didn't hold with such nonsense.Mr. Dursley was the director of a firm called Grunnings, which made drills. He was a big, beefy man with hardly any neck, although he did have a very large mustache. Mrs. Dursley was thin and blonde and had nearly twice the usual amount of neck, which came in very useful as she spent so much of her time craning over garden fences, spying on the neighbors. The Dursley s had a small son called Dudley and in their opinion there was no finer boy anywhere.The Dursleys had everything they wanted, but they also had a secret, and their greatest fear was that somebody would discover it. They didn't think they could bear it if anyone found out about the Potters. Mrs. Potter was Mrs. Dursley's sister, but they hadn'tmet for several years; in fact, Mrs. Dursley pretended she didn't have a sister, because her sister and her good-for-nothing husband were as unDursleyish as it was possible to be. The Dursleys shuddered to think what the neighbors would say if the Potters arrived in the street. The Dursleys knew that the Potters had a small son, too, but they had never even seen him.This boy was another good reason for keeping the Potters away; they didn't want Dudley mixing with a child like that.When Mr. and Mrs. Dursley woke up on the dull, gray Tuesday our story starts, there was nothing about the cloudy sky outside to suggest that strange and mysterious things would soon be happening all over the country. Mr. Dursley hummed as he picked out his most boring tie for work, and Mrs. Dursley gossiped away happily as she wrestled a screaming Dudley into his high chair.", + "met for several years; in fact, Mrs. Dursley pretended she didn't have a sister, because her sister and her good-for-nothing husband were as unDursleyish as it was possible to be. The Dursleys shuddered to think what the neighbors would say if the Potters arrived in the street. The Dursleys knew that the Potters had a small son, too, but they had never even seen him.This boy was another good reason for keeping the Potters away; they didn't want Dudley mixing with a child like that.When Mr. and Mrs. Dursley woke up on the dull, gray Tuesday our story starts, there was nothing about the cloudy sky outside to suggest that strange and mysterious things would soon be happening all over the country. Mr. Dursley hummed as he picked out his most boring tie for work, and Mrs. Dursley gossiped away happily as she wrestled a screaming Dudley into his high chair.None of them noticed a large, tawny owl flutter past the window.At half past eight, Mr. Dursley picked up his briefcase, pecked Mrs. Dursley on the cheek, and tried to kiss Dudley good-bye but missed, because Dudley was now having a tantrum and throwing his cereal at the walls. \"Little tyke,\" chortled Mr. Dursley as he left the house. He got into his car and backed out of number four's drive.It was on the corner of the street that he noticed the first sign of something peculiar — a cat reading a map. For a second, Mr. Dursley didn't realize what he had seen — then he jerked his head around to look again. There was a tabby cat standing on the corner of Privet Drive, but there wasn't a map in sight. What could he have been thinking of? It must have been a trick of the light. Mr. Dursley blinked and stared at", +] test('test My Ghost Writer, ipad mini: navigate between the value list/tables', async ({ page }) => { await page.goto('http://localhost:8000/'); await page.getByRole('button', { name: 'Set UI' }).click(); - console.log(`preparing uploading of file '${testStoryJsonTxt}'!`) - await page.getByRole('link', { name: 'Save / Load' }).click(); - await page.waitForTimeout(100) - const fileChooserPromise = page.waitForEvent('filechooser'); - await page.getByRole('button', { name: '📁 Open File' }).click(); - const fileChooser = await fileChooserPromise; - await fileChooser.setFiles(testStoryJsonTxt); - await page.waitForTimeout(300) - console.log(`file '${testStoryJsonTxt}' uploaded!`) + await uploadFileWithPageAndFilepath(page, testStoryJsonTxt) await page.getByRole('link', { name: 'Settings' }).click(); await page.getByRole('link', { name: 'Tokens' }).click(); @@ -47,10 +44,10 @@ test('test My Ghost Writer, ipad mini: navigate between the value list/tables', await expect(currentTitleTableOfWords).toContainText('the : 734 '); await expect(currentTitleTableOfWords).toHaveAttribute("title", "stem: 'the'") - - await assertCellAndLink(page, gameEditor, 'id-table-0-row-0-nth', "THE BOY WHO"); - await assertCellAndLink(page, gameEditor, 'id-table-0-row-733-nth', "early the next"); - await assertCellAndLink(page, gameEditor, 'id-table-0-row-1-nth', " were the last"); + + await assertCellAndLinkAriaSnapshot(page, 'id-table-0-row-0-nth', "THE BOY WHO", "gametext", expectedStringArray[0]); + await assertCellAndLinkAriaSnapshot(page, 'id-table-0-row-733-nth', "early the next", "gametext", expectedStringArray[1]); + await assertCellAndLinkAriaSnapshot(page, 'id-table-0-row-1-nth', " were the last", "gametext", expectedStringArray[2]); await page.getByText('the Dursleys:').click(); await page.waitForTimeout(100) @@ -59,10 +56,10 @@ test('test My Ghost Writer, ipad mini: navigate between the value list/tables', await page.getByLabel('id-list-of-words-11-nth').click(); await page.waitForTimeout(100) - await assertCellAndLink(page, gameEditor, 'id-table-11-row-2-nth', "to be. The Dursleys", false); + await assertCellAndLinkAriaSnapshot(page, 'id-table-11-row-2-nth', "to be. The Dursleys", "gametext", expectedStringArray[3]); let col2wordsFreq = page.getByLabel('id-col2-words-frequency', { exact: true }) - await expect(col2wordsFreq).toHaveScreenshot() + await expect(col2wordsFreq).toMatchAriaSnapshot({ name: `test-classic-desktop-0--end-col2wordsFreq.txt` }); console.log("end!") page.close() }); diff --git a/static/tests/test-classic-ipad-mini-0-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-ipad-mini-navigate-between-the-value-list-tables-1-iPad-Mini-darwin.png b/static/tests/test-classic-ipad-mini-0-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-ipad-mini-navigate-between-the-value-list-tables-1-iPad-Mini-darwin.png deleted file mode 100644 index 92583e983399713f5e3034f78a6746409288c233..0000000000000000000000000000000000000000 --- a/static/tests/test-classic-ipad-mini-0-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-ipad-mini-navigate-between-the-value-list-tables-1-iPad-Mini-darwin.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d520df757a6d9ee0f4bccc9f0b130e6b73d974e330d6ea99a5cf5cfc886959f8 -size 108977 diff --git a/static/tests/test-classic-ipad-mini-0-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-ipad-mini-navigate-between-the-value-list-tables-2-iPad-Mini-darwin.png b/static/tests/test-classic-ipad-mini-0-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-ipad-mini-navigate-between-the-value-list-tables-2-iPad-Mini-darwin.png deleted file mode 100644 index 239947bd9ed05cd7faa25b48650a6d7a9ec2c251..0000000000000000000000000000000000000000 --- a/static/tests/test-classic-ipad-mini-0-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-ipad-mini-navigate-between-the-value-list-tables-2-iPad-Mini-darwin.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:760b156b4b92a83337ac07e14c80211f3f864cc3df573e962e35356d2844c06a -size 112993 diff --git a/static/tests/test-classic-ipad-mini-0-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-ipad-mini-navigate-between-the-value-list-tables-3-iPad-Mini-darwin.png b/static/tests/test-classic-ipad-mini-0-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-ipad-mini-navigate-between-the-value-list-tables-3-iPad-Mini-darwin.png deleted file mode 100644 index 80f50a3114daebe4756d6ccabbbc5634cd4583f7..0000000000000000000000000000000000000000 --- a/static/tests/test-classic-ipad-mini-0-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-ipad-mini-navigate-between-the-value-list-tables-3-iPad-Mini-darwin.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d743df7643a26f8ad2ff5192a2bed75e3073956ffe9ba17e717298fa9ab20866 -size 115319 diff --git a/static/tests/test-classic-ipad-mini-0-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-ipad-mini-navigate-between-the-value-list-tables-4-iPad-Mini-darwin.png b/static/tests/test-classic-ipad-mini-0-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-ipad-mini-navigate-between-the-value-list-tables-4-iPad-Mini-darwin.png deleted file mode 100644 index 81ef11d4267f506e0f0193fe2576836a49a9ecf1..0000000000000000000000000000000000000000 --- a/static/tests/test-classic-ipad-mini-0-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-ipad-mini-navigate-between-the-value-list-tables-4-iPad-Mini-darwin.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7d7701f4649821009c234ae6ae97a1148083746a581ec746b8c586f217f0330b -size 96058 diff --git a/static/tests/test-classic-landscape-ipad-mini-0-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-ipad-mini-0--end.txt b/static/tests/test-classic-ipad-mini-0-lite.koboldai.net.spec.ts-snapshots/test-classic-desktop-0--end-col2wordsFreq.txt similarity index 100% rename from static/tests/test-classic-landscape-ipad-mini-0-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-ipad-mini-0--end.txt rename to static/tests/test-classic-ipad-mini-0-lite.koboldai.net.spec.ts-snapshots/test-classic-desktop-0--end-col2wordsFreq.txt diff --git a/static/tests/test-classic-ipad-mini-1-lite.koboldai.net.spec.ts b/static/tests/test-classic-ipad-mini-1-lite.koboldai.net.spec.ts index 221ef7dfbcb4fc180624739da3dc189f2cb554d9..db661ba1d127cc150f574ab2a204b0bd56dcde52 100644 --- a/static/tests/test-classic-ipad-mini-1-lite.koboldai.net.spec.ts +++ b/static/tests/test-classic-ipad-mini-1-lite.koboldai.net.spec.ts @@ -1,4 +1,5 @@ import { test, expect } from '@playwright/test'; +import { uploadFileWithPageAndFilepath } from './test-helper' const testStoryJsonTxt = `${import.meta.dirname}/../../tests/events/very_long_text.json` const orderSelectionValues = ["asc", "desc"] @@ -12,15 +13,7 @@ test('test My Ghost Writer, ipad mini: order/sort', async ({ page }) => { await page.getByRole('button', { name: 'Set UI' }).click(); // 3. Upload a saved JSON story file to provide long text content for analysis - console.log(`preparing uploading of file '${testStoryJsonTxt}'!`) - await page.getByRole('link', { name: 'Save / Load' }).click(); - await page.waitForTimeout(100) - const fileChooserPromise = page.waitForEvent('filechooser'); - await page.getByRole('button', { name: '📁 Open File' }).click(); - const fileChooser = await fileChooserPromise; - await fileChooser.setFiles(testStoryJsonTxt); - await page.waitForTimeout(300) - console.log(`file '${testStoryJsonTxt}' uploaded!`) + await uploadFileWithPageAndFilepath(page, testStoryJsonTxt) // 4. Activate "My Ghost Writer" / text stats functionality via settings await page.getByRole('link', { name: 'Settings' }).click(); @@ -63,7 +56,7 @@ test('test My Ghost Writer, ipad mini: order/sort', async ({ page }) => { await page.getByRole('searchbox', { name: 'filter-words-frequency' }).press('Enter'); await page.waitForTimeout(300) // Assert that the list of words container matches the expected ARIA snapshot for this combination - await expect(page.getByLabel('id-list-of-words-container')).toMatchAriaSnapshot({ name: `test-classic-ipad-mini-1--${currentOrderSelectionValue}-${currentSortSelectionValue}.txt` }); + await expect(page.getByLabel('id-list-of-words-container')).toMatchAriaSnapshot({ name: `test-classic-ipad-mini-1--${currentOrderSelectionValue}-${currentSortSelectionValue}--id-list-of-words-container.txt` }); } } // End of test diff --git a/static/tests/test-classic-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-ipad-mini-1--asc-count.txt b/static/tests/test-classic-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-ipad-mini-1--asc-count--id-list-of-words-container.txt similarity index 100% rename from static/tests/test-classic-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-ipad-mini-1--asc-count.txt rename to static/tests/test-classic-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-ipad-mini-1--asc-count--id-list-of-words-container.txt diff --git a/static/tests/test-classic-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-ipad-mini-1--asc-n-words-ngram.txt b/static/tests/test-classic-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-ipad-mini-1--asc-n-words-ngram--id-list-of-words-container.txt similarity index 100% rename from static/tests/test-classic-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-ipad-mini-1--asc-n-words-ngram.txt rename to static/tests/test-classic-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-ipad-mini-1--asc-n-words-ngram--id-list-of-words-container.txt diff --git a/static/tests/test-classic-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-ipad-mini-1--asc-word-prefix.txt b/static/tests/test-classic-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-ipad-mini-1--asc-word-prefix--id-list-of-words-container.txt similarity index 100% rename from static/tests/test-classic-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-ipad-mini-1--asc-word-prefix.txt rename to static/tests/test-classic-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-ipad-mini-1--asc-word-prefix--id-list-of-words-container.txt diff --git a/static/tests/test-classic-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-ipad-mini-1--desc-count.txt b/static/tests/test-classic-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-ipad-mini-1--desc-count--id-list-of-words-container.txt similarity index 100% rename from static/tests/test-classic-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-ipad-mini-1--desc-count.txt rename to static/tests/test-classic-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-ipad-mini-1--desc-count--id-list-of-words-container.txt diff --git a/static/tests/test-classic-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-ipad-mini-1--desc-n-words-ngram.txt b/static/tests/test-classic-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-ipad-mini-1--desc-n-words-ngram--id-list-of-words-container.txt similarity index 100% rename from static/tests/test-classic-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-ipad-mini-1--desc-n-words-ngram.txt rename to static/tests/test-classic-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-ipad-mini-1--desc-n-words-ngram--id-list-of-words-container.txt diff --git a/static/tests/test-classic-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-ipad-mini-1--desc-word-prefix.txt b/static/tests/test-classic-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-ipad-mini-1--desc-word-prefix--id-list-of-words-container.txt similarity index 100% rename from static/tests/test-classic-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-ipad-mini-1--desc-word-prefix.txt rename to static/tests/test-classic-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-ipad-mini-1--desc-word-prefix--id-list-of-words-container.txt diff --git a/static/tests/test-classic-ipad-mini-3-lite.koboldai.net.spec.ts b/static/tests/test-classic-ipad-mini-3-lite.koboldai.net.spec.ts index 10170c25159ddfcae5954ef1d617a27e9af1c335..1b9b3d4f25a50db495f0d87b5ba3597c7bd02931 100644 --- a/static/tests/test-classic-ipad-mini-3-lite.koboldai.net.spec.ts +++ b/static/tests/test-classic-ipad-mini-3-lite.koboldai.net.spec.ts @@ -13,7 +13,7 @@ * 8. Verifying ARIA/accessibility and content. */ import { test, expect, Page } from '@playwright/test'; -import { assertCellAndLink, expectOnlyVisibleTextInElement } from './test-helper' +import { expectOnlyVisibleTextInElement, uploadFileWithPageAndFilepath } from './test-helper' const testStoryJsonTxt = `${import.meta.dirname}/../../tests/events/very_long_text.json` @@ -32,15 +32,7 @@ test('test My Ghost Writer, iPad Mini: try using My Ghost Writer with Aesthetic await page.getByRole('button', { name: 'Set UI' }).click(); // 3. Upload a saved JSON story file to provide long text content for analysis - console.log(`preparing uploading of file '${testStoryJsonTxt}'!`) - await page.getByRole('link', { name: 'Save / Load' }).click(); - await page.waitForTimeout(100) - const fileChooserPromise = page.waitForEvent('filechooser'); - await page.getByRole('button', { name: '📁 Open File' }).click(); - const fileChooser = await fileChooserPromise; - await fileChooser.setFiles(testStoryJsonTxt); - await page.waitForTimeout(300) - console.log(`file '${testStoryJsonTxt}' uploaded!`) + await uploadFileWithPageAndFilepath(page, testStoryJsonTxt) // 4. Open settings and enable the "My Ghost Writer" text stats feature await page.getByRole('link', { name: 'Settings' }).click(); @@ -68,8 +60,7 @@ test('test My Ghost Writer, iPad Mini: try using My Ghost Writer with Aesthetic await page.locator('#gui_type').selectOption('3'); await page.getByRole('button', { name: 'OK' }).click(); - // iPad mode: - console.log("#") + // iPad mode: await expect(page.getByRole('button', { name: 'Show Corpo Side Panel' })).toBeVisible(); await page.getByRole('button', { name: 'Show Corpo Side Panel' }).click(); await page.getByText('Raw Editor', { exact: true }).click(); diff --git a/static/tests/test-classic-landscape-ipad-mini-0-lite.koboldai.net.spec.ts b/static/tests/test-classic-landscape-ipad-mini-0-lite.koboldai.net.spec.ts index db3606c9ab1161711a6e3cc6ea1fd87799ace581..3cc66f8e57bf490d2016b99244f76ce4eaf56932 100644 --- a/static/tests/test-classic-landscape-ipad-mini-0-lite.koboldai.net.spec.ts +++ b/static/tests/test-classic-landscape-ipad-mini-0-lite.koboldai.net.spec.ts @@ -1,27 +1,20 @@ import { test, expect } from '@playwright/test'; -import { assertCellAndLink, assertCellAndLinkAriaSnapshot } from './test-helper' +import { assertCellAndLinkAriaSnapshot, uploadFileWithPageAndFilepath } from './test-helper' const testStoryJsonTxt = `${import.meta.dirname}/../../tests/events/very_long_text.json` const expectedStringArray = [ "THE BOY WHO LIVEDMr. and Mrs. Dursley, of number four, Privet Drive, were proud to say that they were perfectly normal, thank you very much. They were the last people you'd expect to be involved in anything strange or mysterious, because they just didn't hold with such nonsense.Mr. Dursley was the director of a firm called Grunnings, which made drills. He was a big, beefy man with hardly any neck, although he did have a very large mustache. Mrs. Dursley was thin and blonde and had nearly twice the usual amount of neck, which came in very useful as she spent so much of her time craning over garden fences, spying on the neighbors. The Dursley s had a small son called Dudley and in their opinion there was no finer boy anywhere.The Dursleys had everything they wanted, but they also had a secret, and their greatest fear was that somebody would discover it. They didn't think they could bear it if anyone found out about the Potters. Mrs. Potter was Mrs. Dursley's sister, but they hadn'tmet for several years; in fact, Mrs. Dursley pretended she didn't have a sister, because her sister and her good-for-nothing husband were as unDursleyish as it was possible to be. The Dursleys shuddered to think what the neighbors would say if the Potters arrived in the street. The Dursleys knew that the Potters had a small son, too, but they had never even seen him.", "Hagrid looked down at his umbrella and stroked his beard.\"Shouldn'ta lost me temper,\" he said ruefully, \"but it didn't work anyway. Meant ter turn him into a pig, but I suppose he was so much like a pig anyway there wasn't much left ter do.\"He cast a sideways look at Harry under his bushy eyebrows.\"Be grateful if yeh didn't mention that ter anyone at Hogwarts,\" he said. \"I'm — er — not supposed ter do magic, strictly speakin'. I was allowed ter do a bit ter follow yeh an' get yer letters to yeh an' stuff — one o' the reasons I was so keen ter take on the job — \"\"Why aren't you supposed to do magic?\" asked Harry.\"Oh, well — I was at Hogwarts meself but I — er — got expelled, ter tell yeh the truth. In me third year. They snapped me wand in half an' everything. But Dumbledore let me stay on as gamekeeper. Great man, Dumbledore.\"\"Why were you expelled?\"\"It's gettin' late and we've got lots ter do tomorrow,\" said Hagrid loudly. \"Gotta get up ter town, get all yer books an' that.\"He took off his thick black coat and threw it to Harry.\"You can kip under that,\" he said. \"Don' mind if it wriggles a bit, I think I still got a couple o' dormice in one o' the pockets.\"Harry woke early the next morning. Although he could", - "Mr. and Mrs. Dursley, of number four, Privet Drive, were proud to say that they were perfectly normal, thank you very much. They were the last people you'd expect to be involved in anything strange or mysterious, because they just didn't hold with such nonsense.Mr. Dursley was the director of a firm called Grunnings, which made drills. He was a big, beefy man with hardly any neck, although he did have a very large mustache. Mrs. Dursley was thin and blonde and had nearly twice the usual amount of neck, which came in very useful as she spent so much of her time craning over garden fences, spying on the neighbors. The Dursley s had a small son called Dudley and in their opinion there was no finer boy anywhere.The Dursleys had everything they wanted, but they also had a secret, and their greatest fear was that somebody would discover it. They didn't think they could bear it if anyone found out about the Potters. Mrs. Potter was Mrs. Dursley's sister, but they hadn'tmet for several years; in fact, Mrs. Dursley pretended she didn't have a sister, because her sister and her good-for-nothing husband were as unDursleyish as it was possible to be. The Dursleys shuddered to think what the neighbors would say if the Potters arrived in the street. The Dursleys knew that the Potters had a small son, too, but they had never even seen him." + "Mr. and Mrs. Dursley, of number four, Privet Drive, were proud to say that they were perfectly normal, thank you very much. They were the last people you'd expect to be involved in anything strange or mysterious, because they just didn't hold with such nonsense.Mr. Dursley was the director of a firm called Grunnings, which made drills. He was a big, beefy man with hardly any neck, although he did have a very large mustache. Mrs. Dursley was thin and blonde and had nearly twice the usual amount of neck, which came in very useful as she spent so much of her time craning over garden fences, spying on the neighbors. The Dursley s had a small son called Dudley and in their opinion there was no finer boy anywhere.The Dursleys had everything they wanted, but they also had a secret, and their greatest fear was that somebody would discover it. They didn't think they could bear it if anyone found out about the Potters. Mrs. Potter was Mrs. Dursley's sister, but they hadn'tmet for several years; in fact, Mrs. Dursley pretended she didn't have a sister, because her sister and her good-for-nothing husband were as unDursleyish as it was possible to be. The Dursleys shuddered to think what the neighbors would say if the Potters arrived in the street. The Dursleys knew that the Potters had a small son, too, but they had never even seen him.", + "met for several years; in fact, Mrs. Dursley pretended she didn't have a sister, because her sister and her good-for-nothing husband were as unDursleyish as it was possible to be. The Dursleys shuddered to think what the neighbors would say if the Potters arrived in the street. The Dursleys knew that the Potters had a small son, too, but they had never even seen him.This boy was another good reason for keeping the Potters away; they didn't want Dudley mixing with a child like that.When Mr. and Mrs. Dursley woke up on the dull, gray Tuesday our story starts, there was nothing about the cloudy sky outside to suggest that strange and mysterious things would soon be happening all over the country. Mr. Dursley hummed as he picked out his most boring tie for work, and Mrs. Dursley gossiped away happily as she wrestled a screaming Dudley into his high chair.None of them noticed a large, tawny owl flutter past the window.At half past eight, Mr. Dursley picked up his briefcase, pecked Mrs. Dursley on the cheek, and tried to kiss Dudley good-bye but missed, because Dudley was now having a tantrum and throwing his cereal at the walls. \"Little tyke,\" chortled Mr. Dursley as he left the house. He got into his car and backed out of number four's drive.It was on the corner of the street that he noticed the first sign of something peculiar — a cat reading a map. For a second, Mr. Dursley didn't realize what he had seen — then he jerked his head around to look again. There was a tabby cat standing on the corner of Privet Drive, but there wasn't a map in sight. What could he have been thinking of? It must have been a trick of the light. Mr. Dursley blinked and stared at" ] -test('test My Ghost Writer, ipad mini landscape: navigate between the value list/tables', async ({ page }, testInfo) => { +test('test My Ghost Writer, ipad mini landscape: navigate between the value list/tables', async ({ page }) => { await page.goto('http://localhost:8000/'); await page.getByRole('button', { name: 'Set UI' }).click(); - console.log(`preparing uploading of file '${testStoryJsonTxt}'!`) - await page.getByRole('link', { name: 'Save / Load' }).click(); - await page.waitForTimeout(100) - const fileChooserPromise = page.waitForEvent('filechooser'); - await page.getByRole('button', { name: '📁 Open File' }).click(); - const fileChooser = await fileChooserPromise; - await fileChooser.setFiles(testStoryJsonTxt); - await page.waitForTimeout(300) - console.log(`file '${testStoryJsonTxt}' uploaded!`) + await uploadFileWithPageAndFilepath(page, testStoryJsonTxt) await page.getByRole('link', { name: 'Settings' }).click(); await page.getByRole('link', { name: 'Tokens' }).click(); @@ -65,10 +58,10 @@ test('test My Ghost Writer, ipad mini landscape: navigate between the value list await page.getByLabel('id-list-of-words-11-nth').click(); await page.waitForTimeout(100) - await assertCellAndLink(page, gameEditor, 'id-table-11-row-2-nth', "to be. The Dursleys", false); + await assertCellAndLinkAriaSnapshot(page, 'id-table-11-row-2-nth', "to be. The Dursleys", "gametext", expectedStringArray[3]); let col2wordsFreq = page.getByLabel('id-col2-words-frequency', { exact: true }) - await expect(col2wordsFreq).toMatchAriaSnapshot({ name: `test-classic-landscape-ipad-mini-0--end.txt` }); + await expect(col2wordsFreq).toMatchAriaSnapshot({ name: `test-classic-landscape-ipad-mini-0--end-col2wordsFreq.txt` }); console.log("end!") page.close() }); diff --git a/static/tests/test-classic-landscape-ipad-mini-0-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-ipad-mini-0--end-col2wordsFreq.txt b/static/tests/test-classic-landscape-ipad-mini-0-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-ipad-mini-0--end-col2wordsFreq.txt new file mode 100644 index 0000000000000000000000000000000000000000..a4aa6450957ae995c84ad4e3894a379cc930c9e6 --- /dev/null +++ b/static/tests/test-classic-landscape-ipad-mini-0-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-ipad-mini-0--end-col2wordsFreq.txt @@ -0,0 +1,1778 @@ +- text: /\d+ stems, \d+ rows/ +- searchbox "filter-words-frequency" +- combobox "id-select-order-by": + - option "order-by-up-opt" + - option "order-by-down-opt" [selected] +- combobox "id-select-sort-by": + - option "sort-by-found-words-opt" [selected] + - option "sort-by-name-opt" + - option "sort-by-ngram-words-opt" +- text: "/th : \\d+ occ\\./" +- listitem: "/the: \\d+ reps\\./" +- listitem: "/that: \\d+ reps\\./" +- listitem: "/they: \\d+ reps\\./" +- listitem: "/with: \\d+ reps\\./" +- listitem: "/on the: \\d+ reps\\./" +- listitem: "/this: \\d+ reps\\./" +- listitem: "/them: \\d+ reps\\./" +- listitem: "/there: \\d+ reps\\./" +- listitem: "/in the: \\d+ reps\\./" +- listitem: "/of the: \\d+ reps\\./" +- listitem: "/at the: \\d+ reps\\./" +- listitem: "/the Dursleys: \\d+ reps\\./" +- listitem: "/their: \\d+ reps\\./" +- listitem: "/then: \\d+ reps\\./" +- listitem: "/\\. The: \\d+ reps\\./" +- listitem: "/things: \\d+ reps\\./" +- listitem: "/something: \\d+ reps\\./" +- listitem: "/to the: \\d+ reps\\./" +- listitem: "/into the: \\d+ reps\\./" +- listitem: "/, the: \\d+ reps\\./" +- listitem: "/think: \\d+ reps\\./" +- listitem: "/though: \\d+ reps\\./" +- listitem: "/anything: \\d+ reps\\./" +- listitem: "/thought: \\d+ reps\\./" +- listitem: "/they': \\d+ reps\\./" +- listitem: "/through: \\d+ reps\\./" +- listitem: "/there was: \\d+ reps\\./" +- listitem: "/with a: \\d+ reps\\./" +- listitem: "/\\. They: \\d+ reps\\./" +- listitem: "/as though: \\d+ reps\\./" +- listitem: "/the letter: \\d+ reps\\./" +- listitem: "/the cat: \\d+ reps\\./" +- listitem: "/they were: \\d+ reps\\./" +- listitem: "/was the: \\d+ reps\\./" +- listitem: "/over the: \\d+ reps\\./" +- listitem: "/of them: \\d+ reps\\./" +- listitem: "/than: \\d+ reps\\./" +- listitem: "/that': \\d+ reps\\./" +- listitem: "/through the: \\d+ reps\\./" +- listitem: "/the house: \\d+ reps\\./" +- listitem: "/from the: \\d+ reps\\./" +- listitem: "/the door: \\d+ reps\\./" +- listitem: "/them\\.: \\d+ reps\\./" +- listitem: "/the giant: \\d+ reps\\./" +- listitem: "/the kitchen: \\d+ reps\\./" +- listitem: "/the street: \\d+ reps\\./" +- listitem: "/the first: \\d+ reps\\./" +- listitem: "/all the: \\d+ reps\\./" +- listitem: "/and the: \\d+ reps\\./" +- listitem: "/, they: \\d+ reps\\./" +- listitem: "/other: \\d+ reps\\./" +- listitem: "/mother: \\d+ reps\\./" +- listitem: "/the snake: \\d+ reps\\./" +- listitem: "/the Potters: \\d+ reps\\./" +- listitem: "/with his: \\d+ reps\\./" +- listitem: "/the next: \\d+ reps\\./" +- listitem: "/his mother: \\d+ reps\\./" +- listitem: "/and then: \\d+ reps\\./" +- listitem: "/the glass: \\d+ reps\\./" +- listitem: "/another: \\d+ reps\\./" +- listitem: "/nothing: \\d+ reps\\./" +- listitem: "/them,: \\d+ reps\\./" +- listitem: "/the same: \\d+ reps\\./" +- listitem: "/with the: \\d+ reps\\./" +- listitem: "/by the: \\d+ reps\\./" +- listitem: "/the way: \\d+ reps\\./" +- listitem: "that the: 9 reps." +- listitem: "the wall: 9 reps." +- listitem: "that he: 9 reps." +- listitem: "these: 9 reps." +- listitem: "the only: 9 reps." +- listitem: "down the: 9 reps." +- listitem: "without: 9 reps." +- listitem: "birthday: 9 reps." +- listitem: "the car: 9 reps." +- listitem: "everything: 8 reps." +- listitem: ", there: 8 reps." +- listitem: "the corner: 8 reps." +- listitem: "around the: 8 reps." +- listitem: "up the: 8 reps." +- listitem: "this was: 8 reps." +- listitem: ", that: 8 reps." +- listitem: "the front: 8 reps." +- listitem: "both: 8 reps." +- listitem: "rather: 8 reps." +- listitem: "\"That: 8 reps." +- listitem: "father: 8 reps." +- listitem: "for the: 8 reps." +- listitem: "though he: 8 reps." +- listitem: "the mail: 8 reps." +- listitem: "the boy: 7 reps." +- listitem: ". There: 7 reps." +- listitem: "the owls: 7 reps." +- listitem: "that was: 7 reps." +- listitem: "said the: 7 reps." +- listitem: "the other: 7 reps." +- listitem: "threw: 7 reps." +- listitem: "then,: 7 reps." +- listitem: "under the: 7 reps." +- listitem: "the sofa: 7 reps." +- listitem: "' the: 7 reps." +- listitem: "thin: 6 reps." +- listitem: "but they: 6 reps." +- listitem: "they could: 6 reps." +- listitem: "about the: 6 reps." +- listitem: "to think: 6 reps." +- listitem: "he thought: 6 reps." +- listitem: "clothes: 6 reps." +- listitem: "together: 6 reps." +- listitem: ". This: 6 reps." +- listitem: "do with: 6 reps." +- listitem: "as they: 6 reps." +- listitem: "there.: 6 reps." +- listitem: "but the: 6 reps." +- listitem: "the air: 6 reps." +- listitem: "mouth: 6 reps." +- listitem: "his father: 6 reps." +- listitem: "the room: 6 reps." +- listitem: "the hall: 6 reps." +- listitem: "the time: 6 reps." +- listitem: "the zoo: 6 reps." +- listitem: "thank: 5 reps." +- listitem: "was that: 5 reps." +- listitem: "t think: 5 reps." +- listitem: "they had: 5 reps." +- listitem: "Then he: 5 reps." +- listitem: ", though: 5 reps." +- listitem: "thought he: 5 reps." +- listitem: "\"The: 5 reps." +- listitem: "as the: 5 reps." +- listitem: "that,: 5 reps." +- listitem: "all this: 5 reps." +- listitem: "the whole: 5 reps." +- listitem: "though she: 5 reps." +- listitem: ". Then: 5 reps." +- listitem: "three: 5 reps." +- listitem: "the table: 5 reps." +- listitem: "that Harry: 5 reps." +- listitem: "thick: 5 reps." +- listitem: "that Dudley: 5 reps." +- listitem: "this,: 5 reps." +- listitem: "the back: 5 reps." +- listitem: "get the: 5 reps." +- listitem: "and threw: 5 reps." +- listitem: "although: 4 reps." +- listitem: "they didn: 4 reps." +- listitem: "if the: 4 reps." +- listitem: "like that: 4 reps." +- listitem: "the lights: 4 reps." +- listitem: "the road: 4 reps." +- listitem: "— the: 4 reps." +- listitem: "than he: 4 reps." +- listitem: "these people: 4 reps." +- listitem: "for something: 4 reps." +- listitem: "something to: 4 reps." +- listitem: "there were: 4 reps." +- listitem: "outside the: 4 reps." +- listitem: "the ground: 4 reps." +- listitem: "the living: 4 reps." +- listitem: "something.: 4 reps." +- listitem: "the Muggles: 4 reps." +- listitem: "the moment: 4 reps." +- listitem: "is that: 4 reps." +- listitem: "And they: 4 reps." +- listitem: "s the: 4 reps." +- listitem: "toward the: 4 reps." +- listitem: "open the: 4 reps." +- listitem: "mother.: 4 reps." +- listitem: "there,: 4 reps." +- listitem: "the day: 4 reps." +- listitem: "s birthday: 4 reps." +- listitem: "thirty: 4 reps." +- listitem: ", with: 4 reps." +- listitem: "the floor: 4 reps." +- listitem: "thinking about: 4 reps." +- listitem: "breath: 4 reps." +- listitem: "the rock: 4 reps." +- listitem: "the hut: 4 reps." +- listitem: "the sea: 4 reps." +- listitem: "that they: 3 reps." +- listitem: ", thank: 3 reps." +- listitem: "thank you: 3 reps." +- listitem: "were the: 3 reps." +- listitem: "with such: 3 reps." +- listitem: "although he: 3 reps." +- listitem: "in their: 3 reps." +- listitem: "think they: 3 reps." +- listitem: "knew that: 3 reps." +- listitem: "this boy: 3 reps." +- listitem: "; they: 3 reps." +- listitem: "that.: 3 reps." +- listitem: "there wasn: 3 reps." +- listitem: "think of: 3 reps." +- listitem: "read the: 3 reps." +- listitem: "the sign: 3 reps." +- listitem: "put the: 3 reps." +- listitem: "get that: 3 reps." +- listitem: "the edge: 3 reps." +- listitem: "of these: 3 reps." +- listitem: "together.: 3 reps." +- listitem: "across the: 3 reps." +- listitem: "the people: 3 reps." +- listitem: "those: 3 reps." +- listitem: "realized that: 3 reps." +- listitem: "the man: 3 reps." +- listitem: ", this: 3 reps." +- listitem: "the middle: 3 reps." +- listitem: "had the: 3 reps." +- listitem: "anything to: 3 reps." +- listitem: "Only the: 3 reps." +- listitem: "the place: 3 reps." +- listitem: "the name: 3 reps." +- listitem: "they went: 3 reps." +- listitem: "That evening: 3 reps." +- listitem: ", thin: 3 reps." +- listitem: "of their: 3 reps." +- listitem: "the very: 3 reps." +- listitem: "find the: 3 reps." +- listitem: "— that: 3 reps." +- listitem: "them all: 3 reps." +- listitem: "the best: 3 reps." +- listitem: "the top: 3 reps." +- listitem: "the motorcycle: 3 reps." +- listitem: "off the: 3 reps." +- listitem: "there?: 3 reps." +- listitem: "s that: 3 reps." +- listitem: "the night: 3 reps." +- listitem: "out the: 3 reps." +- listitem: "to their: 3 reps." +- listitem: "so that: 3 reps." +- listitem: "there had: 3 reps." +- listitem: "the sound: 3 reps." +- listitem: "the cupboard: 3 reps." +- listitem: "the second: 3 reps." +- listitem: "the rest: 3 reps." +- listitem: "father.: 3 reps." +- listitem: "at that: 3 reps." +- listitem: "that moment: 3 reps." +- listitem: "the telephone: 3 reps." +- listitem: "the roof: 3 reps." +- listitem: "telling them: 3 reps." +- listitem: "be with: 3 reps." +- listitem: "with Dudley: 3 reps." +- listitem: "anything.: 3 reps." +- listitem: "they seemed: 3 reps." +- listitem: "that it: 3 reps." +- listitem: "the reptile: 3 reps." +- listitem: "in there: 3 reps." +- listitem: "against the: 3 reps." +- listitem: "this is: 3 reps." +- listitem: "the ceiling: 3 reps." +- listitem: "both of: 3 reps." +- listitem: "them as: 3 reps." +- listitem: "the biggest: 3 reps." +- listitem: "the end: 3 reps." +- listitem: "each other: 3 reps." +- listitem: ", both: 3 reps." +- listitem: "the doormat: 3 reps." +- listitem: "the envelope: 3 reps." +- listitem: "the head: 3 reps." +- listitem: "slammed the: 3 reps." +- listitem: "behind them: 3 reps." +- listitem: "mother,: 3 reps." +- listitem: "this time: 3 reps." +- listitem: "sure that: 3 reps." +- listitem: "the fireplace: 3 reps." +- listitem: "thing happened: 3 reps." +- listitem: "thundered: 3 reps." +- listitem: "the storm: 3 reps." +- listitem: "his mouth: 3 reps." +- listitem: "the world: 3 reps." +- listitem: "somethin: 3 reps." +- listitem: "somethin': 3 reps." +- listitem: "say that: 2 reps." +- listitem: "the last: 2 reps." +- listitem: "in anything: 2 reps." +- listitem: ", although: 2 reps." +- listitem: "the usual: 2 reps." +- listitem: "the neighbors: 2 reps." +- listitem: "they also: 2 reps." +- listitem: "and their: 2 reps." +- listitem: "was nothing: 2 reps." +- listitem: "the country: 2 reps." +- listitem: "the window: 2 reps." +- listitem: "left the: 2 reps." +- listitem: "of something: 2 reps." +- listitem: "— then: 2 reps." +- listitem: "but there: 2 reps." +- listitem: "been thinking: 2 reps." +- listitem: "watched the: 2 reps." +- listitem: "that said: 2 reps." +- listitem: "that day: 2 reps." +- listitem: "something else: 2 reps." +- listitem: "that this: 2 reps." +- listitem: "drills that: 2 reps." +- listitem: "that morning: 2 reps." +- listitem: "see the: 2 reps." +- listitem: "what they: 2 reps." +- listitem: "their son: 2 reps." +- listitem: "say something: 2 reps." +- listitem: "to them: 2 reps." +- listitem: "but thought: 2 reps." +- listitem: "thinking ...: 2 reps." +- listitem: "sure there: 2 reps." +- listitem: "that afternoon: 2 reps." +- listitem: "voice that: 2 reps." +- listitem: "that made: 2 reps." +- listitem: "the spot: 2 reps." +- listitem: "imagining things: 2 reps." +- listitem: "things,: 2 reps." +- listitem: "the tabby: 2 reps." +- listitem: "Was this: 2 reps." +- listitem: "together,: 2 reps." +- listitem: "with her: 2 reps." +- listitem: "weather: 2 reps." +- listitem: ". Although: 2 reps." +- listitem: "about that: 2 reps." +- listitem: "throat: 2 reps." +- listitem: "the news: 2 reps." +- listitem: "was something: 2 reps." +- listitem: "heard the: 2 reps." +- listitem: "bathroom: 2 reps." +- listitem: "still there: 2 reps." +- listitem: "though it: 2 reps." +- listitem: "out that: 2 reps." +- listitem: "think he: 2 reps." +- listitem: "about them: 2 reps." +- listitem: "them and: 2 reps." +- listitem: "anything that: 2 reps." +- listitem: "before the: 2 reps." +- listitem: "like this: 2 reps." +- listitem: "this man: 2 reps." +- listitem: "the silver: 2 reps." +- listitem: "other end: 2 reps." +- listitem: "The nearest: 2 reps." +- listitem: "out with: 2 reps." +- listitem: "a rather: 2 reps." +- listitem: "exactly the: 2 reps." +- listitem: "noticed something: 2 reps." +- listitem: "on their: 2 reps." +- listitem: "know that: 2 reps." +- listitem: "threw a: 2 reps." +- listitem: "re the: 2 reps." +- listitem: "the rumors: 2 reps." +- listitem: "reached the: 2 reps." +- listitem: "the point: 2 reps." +- listitem: "the real: 2 reps." +- listitem: "and that: 2 reps." +- listitem: "the things: 2 reps." +- listitem: "things to: 2 reps." +- listitem: "beneath: 2 reps." +- listitem: "you think: 2 reps." +- listitem: "think you: 2 reps." +- listitem: "— there: 2 reps." +- listitem: "something he: 2 reps." +- listitem: "all that: 2 reps." +- listitem: "mouth,: 2 reps." +- listitem: "then said: 2 reps." +- listitem: "is the: 2 reps." +- listitem: "think it: 2 reps." +- listitem: "Hagrid with: 2 reps." +- listitem: "this?: 2 reps." +- listitem: "the right: 2 reps." +- listitem: "that?: 2 reps." +- listitem: "around them: 2 reps." +- listitem: "were there: 2 reps." +- listitem: "the bundle: 2 reps." +- listitem: "get this: 2 reps." +- listitem: "wake the: 2 reps." +- listitem: "live with: 2 reps." +- listitem: "the low: 2 reps." +- listitem: "onto the: 2 reps." +- listitem: "and with: 2 reps." +- listitem: "spend the: 2 reps." +- listitem: "at this: 2 reps." +- listitem: "the photographs: 2 reps." +- listitem: "father,: 2 reps." +- listitem: "the bacon: 2 reps." +- listitem: "birthday.: 2 reps." +- listitem: ", nothing: 2 reps." +- listitem: "because the: 2 reps." +- listitem: "the stairs: 2 reps." +- listitem: "the racing: 2 reps." +- listitem: "old clothes: 2 reps." +- listitem: "only thing: 2 reps." +- listitem: "and thick: 2 reps." +- listitem: "his thick: 2 reps." +- listitem: "thick,: 2 reps." +- listitem: "said that: 2 reps." +- listitem: "mother and: 2 reps." +- listitem: "and father: 2 reps." +- listitem: "less than: 2 reps." +- listitem: "turned the: 2 reps." +- listitem: "that all: 2 reps." +- listitem: "Dudley thought: 2 reps." +- listitem: "thirty ...: 2 reps." +- listitem: "grabbed the: 2 reps." +- listitem: "then.: 2 reps." +- listitem: "worth: 2 reps." +- listitem: "this.: 2 reps." +- listitem: "something very: 2 reps." +- listitem: "they weren: 2 reps." +- listitem: "That cars: 2 reps." +- listitem: "anything he: 2 reps." +- listitem: "the gap: 2 reps." +- listitem: "with him: 2 reps." +- listitem: "before they: 2 reps." +- listitem: "in that: 2 reps." +- listitem: "do anything: 2 reps." +- listitem: "anything,: 2 reps." +- listitem: "telling the: 2 reps." +- listitem: "clothes and: 2 reps." +- listitem: "other hand: 2 reps." +- listitem: "the school: 2 reps." +- listitem: "behind the: 2 reps." +- listitem: "the big: 2 reps." +- listitem: "the wind: 2 reps." +- listitem: "they don: 2 reps." +- listitem: "one thing: 2 reps." +- listitem: "about anything: 2 reps." +- listitem: "Harry thought: 2 reps." +- listitem: "They ate: 2 reps." +- listitem: "another one: 2 reps." +- listitem: "slithering: 2 reps." +- listitem: "found the: 2 reps." +- listitem: "worse than: 2 reps." +- listitem: "where the: 2 reps." +- listitem: "visit the: 2 reps." +- listitem: "with Harry: 2 reps." +- listitem: "sure the: 2 reps." +- listitem: "The boa: 2 reps." +- listitem: "; the: 2 reps." +- listitem: "The great: 2 reps." +- listitem: "The keeper: 2 reps." +- listitem: "time they: 2 reps." +- listitem: "up with: 2 reps." +- listitem: "the green: 2 reps." +- listitem: "them in: 2 reps." +- listitem: "without a: 2 reps." +- listitem: "all these: 2 reps." +- listitem: "thought this: 2 reps." +- listitem: "\" Then: 2 reps." +- listitem: "the family: 2 reps." +- listitem: "while the: 2 reps." +- listitem: "They heard: 2 reps." +- listitem: "the Smelting: 2 reps." +- listitem: "that looked: 2 reps." +- listitem: "the address: 2 reps." +- listitem: "the bill: 2 reps." +- listitem: "the postcard: 2 reps." +- listitem: "forgotten that: 2 reps." +- listitem: "that letter: 2 reps." +- listitem: "their necks: 2 reps." +- listitem: "them into: 2 reps." +- listitem: "the crack: 2 reps." +- listitem: "If they: 2 reps." +- listitem: "deep breaths: 2 reps." +- listitem: "breaths and: 2 reps." +- listitem: "about this: 2 reps." +- listitem: "things that: 2 reps." +- listitem: "the bed: 2 reps." +- listitem: "with that: 2 reps." +- listitem: "When the: 2 reps." +- listitem: "There': 2 reps." +- listitem: "And this: 2 reps." +- listitem: "the dark: 2 reps." +- listitem: "Petunia through: 2 reps." +- listitem: "through a: 2 reps." +- listitem: "they couldn: 2 reps." +- listitem: "their way: 2 reps." +- listitem: "their faces: 2 reps." +- listitem: "They drove: 2 reps." +- listitem: "inside the: 2 reps." +- listitem: "his birthdays: 2 reps." +- listitem: "thin package: 2 reps." +- listitem: "hands together: 2 reps." +- listitem: "the empty: 2 reps." +- listitem: "those letters: 2 reps." +- listitem: "they got: 2 reps." +- listitem: "Then —: 2 reps." +- listitem: "saw that: 2 reps." +- listitem: "that you: 2 reps." +- listitem: "threw it: 2 reps." +- listitem: "happy birthday: 2 reps." +- listitem: "warmth: 2 reps." +- listitem: "filled the: 2 reps." +- listitem: "the pockets: 2 reps." +- listitem: "— this: 2 reps." +- listitem: "Harry with: 2 reps." +- listitem: ". With: 2 reps." +- listitem: "to that: 2 reps." +- listitem: "the fire: 2 reps." +- listitem: "this wizard: 2 reps." +- listitem: "' then: 2 reps." +- listitem: "knew they: 2 reps." +- listitem: ". That: 2 reps." +- listitem: "' that: 2 reps." +- listitem: "out there: 2 reps." +- listitem: "the greatest: 2 reps." +- listitem: "I think: 2 reps." +- listitem: "think I: 2 reps." +- listitem: "anything strange: 1 reps." +- listitem: "because they: 1 reps." +- listitem: "they just: 1 reps." +- listitem: "hold with: 1 reps." +- listitem: "the director: 1 reps." +- listitem: "man with: 1 reps." +- listitem: "with hardly: 1 reps." +- listitem: "was thin: 1 reps." +- listitem: "thin and: 1 reps." +- listitem: "twice the: 1 reps." +- listitem: "their opinion: 1 reps." +- listitem: "opinion there: 1 reps." +- listitem: "had everything: 1 reps." +- listitem: "everything they: 1 reps." +- listitem: "they wanted: 1 reps." +- listitem: "their greatest: 1 reps." +- listitem: "that somebody: 1 reps." +- listitem: "they hadn: 1 reps." +- listitem: "good-for-nothing: 1 reps." +- listitem: "her good-for-nothing: 1 reps." +- listitem: "good-for-nothing husband: 1 reps." +- listitem: "think what: 1 reps." +- listitem: "what the: 1 reps." +- listitem: "was another: 1 reps." +- listitem: "another good: 1 reps." +- listitem: "keeping the: 1 reps." +- listitem: "mixing with: 1 reps." +- listitem: "the dull: 1 reps." +- listitem: "nothing about: 1 reps." +- listitem: "the cloudy: 1 reps." +- listitem: "suggest that: 1 reps." +- listitem: "that strange: 1 reps." +- listitem: "mysterious things: 1 reps." +- listitem: "things would: 1 reps." +- listitem: "them noticed: 1 reps." +- listitem: "past the: 1 reps." +- listitem: "throwing: 1 reps." +- listitem: "the cheek: 1 reps." +- listitem: "and throwing: 1 reps." +- listitem: "throwing his: 1 reps." +- listitem: "street that: 1 reps." +- listitem: "noticed the: 1 reps." +- listitem: "something peculiar: 1 reps." +- listitem: "sign that: 1 reps." +- listitem: "thought of: 1 reps." +- listitem: "of nothing: 1 reps." +- listitem: "nothing except: 1 reps." +- listitem: "by something: 1 reps." +- listitem: "noticing that: 1 reps." +- listitem: "that there: 1 reps." +- listitem: "there seemed: 1 reps." +- listitem: "funny clothes: 1 reps." +- listitem: "clothes —: 1 reps." +- listitem: "the getups: 1 reps." +- listitem: "supposed this: 1 reps." +- listitem: "the steering: 1 reps." +- listitem: "these weirdos: 1 reps." +- listitem: "excitedly together: 1 reps." +- listitem: "see that: 1 reps." +- listitem: "that a: 1 reps." +- listitem: "them weren: 1 reps." +- listitem: "that man: 1 reps." +- listitem: "older than: 1 reps." +- listitem: "! The: 1 reps." +- listitem: "The nerve: 1 reps." +- listitem: "But then: 1 reps." +- listitem: "then it: 1 reps." +- listitem: "Dursley that: 1 reps." +- listitem: "— these: 1 reps." +- listitem: "something ...: 1 reps." +- listitem: "that would: 1 reps." +- listitem: "The traffic: 1 reps." +- listitem: "the Grunnings: 1 reps." +- listitem: "ninth: 1 reps." +- listitem: "open-mouthed: 1 reps." +- listitem: "sat with: 1 reps." +- listitem: "the ninth: 1 reps." +- listitem: "ninth floor: 1 reps." +- listitem: "though people: 1 reps." +- listitem: "they pointed: 1 reps." +- listitem: "gazed open-mouthed: 1 reps." +- listitem: "open-mouthed as: 1 reps." +- listitem: "them had: 1 reps." +- listitem: "the bakery: 1 reps." +- listitem: "them next: 1 reps." +- listitem: "the baker: 1 reps." +- listitem: "eyed them: 1 reps." +- listitem: "them angrily: 1 reps." +- listitem: "they made: 1 reps." +- listitem: "This bunch: 1 reps." +- listitem: "past them: 1 reps." +- listitem: ", their: 1 reps." +- listitem: "the whisperers: 1 reps." +- listitem: "thought better: 1 reps." +- listitem: "the receiver: 1 reps." +- listitem: ", thinking: 1 reps." +- listitem: "seen the: 1 reps." +- listitem: "that ...: 1 reps." +- listitem: ", those: 1 reps." +- listitem: "those people: 1 reps." +- listitem: "the building: 1 reps." +- listitem: "worried that: 1 reps." +- listitem: "the tiny: 1 reps." +- listitem: "the contrary: 1 reps." +- listitem: "for nothing: 1 reps." +- listitem: "nothing could: 1 reps." +- listitem: "this happy: 1 reps." +- listitem: "the old: 1 reps." +- listitem: "also thought: 1 reps." +- listitem: "whatever that: 1 reps." +- listitem: "the driveway: 1 reps." +- listitem: "first thing: 1 reps." +- listitem: "thing he: 1 reps." +- listitem: "spotted that: 1 reps." +- listitem: "this normal: 1 reps." +- listitem: "himself together: 1 reps." +- listitem: "mention anything: 1 reps." +- listitem: "problems with: 1 reps." +- listitem: "catch the: 1 reps." +- listitem: "the evening: 1 reps." +- listitem: "reported that: 1 reps." +- listitem: "the nation: 1 reps." +- listitem: "Although owls: 1 reps." +- listitem: "there have: 1 reps." +- listitem: "these birds: 1 reps." +- listitem: "why the: 1 reps." +- listitem: "changed their: 1 reps." +- listitem: "their sleeping: 1 reps." +- listitem: "The newscaster: 1 reps." +- listitem: "McGuffin with: 1 reps." +- listitem: "the weather: 1 reps." +- listitem: "weather.: 1 reps." +- listitem: "weatherman: 1 reps." +- listitem: "the weatherman: 1 reps." +- listitem: "weatherman,: 1 reps." +- listitem: "owls that: 1 reps." +- listitem: "that have: 1 reps." +- listitem: "me that: 1 reps." +- listitem: "that instead: 1 reps." +- listitem: "the rain: 1 reps." +- listitem: "his throat: 1 reps." +- listitem: "throat nervously: 1 reps." +- listitem: "they normally: 1 reps." +- listitem: "and there: 1 reps." +- listitem: "just thought: 1 reps." +- listitem: "thought ...: 1 reps." +- listitem: "with ...: 1 reps." +- listitem: "whether: 1 reps." +- listitem: "tea through: 1 reps." +- listitem: "through pursed: 1 reps." +- listitem: "wondered whether: 1 reps." +- listitem: "whether he: 1 reps." +- listitem: "\"Their: 1 reps." +- listitem: "say another: 1 reps." +- listitem: "another word: 1 reps." +- listitem: "the subject: 1 reps." +- listitem: "the bathroom: 1 reps." +- listitem: "bathroom,: 1 reps." +- listitem: "the bedroom: 1 reps." +- listitem: "things?: 1 reps." +- listitem: "this have: 1 reps." +- listitem: "have anything: 1 reps." +- listitem: "comforting thought: 1 reps." +- listitem: "thought before: 1 reps." +- listitem: "for them: 1 reps." +- listitem: "them to: 1 reps." +- listitem: "Petunia thought: 1 reps." +- listitem: "thought about: 1 reps." +- listitem: "their kind: 1 reps." +- listitem: "that might: 1 reps." +- listitem: "affect them: 1 reps." +- listitem: "the far: 1 reps." +- listitem: "corner the: 1 reps." +- listitem: "have thought: 1 reps." +- listitem: "Nothing like: 1 reps." +- listitem: "thin,: 1 reps." +- listitem: "were both: 1 reps." +- listitem: "both long: 1 reps." +- listitem: "cloak that: 1 reps." +- listitem: "that swept: 1 reps." +- listitem: "swept the: 1 reps." +- listitem: "where everything: 1 reps." +- listitem: "everything from: 1 reps." +- listitem: "the sight: 1 reps." +- listitem: "clicked the: 1 reps." +- listitem: "the Put-Outer: 1 reps." +- listitem: "until the: 1 reps." +- listitem: "the distance: 1 reps." +- listitem: "the eyes: 1 reps." +- listitem: "their window: 1 reps." +- listitem: "they wouldn: 1 reps." +- listitem: "see anything: 1 reps." +- listitem: "the pavement: 1 reps." +- listitem: "slipped the: 1 reps." +- listitem: "the Put-: 1 reps." +- listitem: "rather severe-looking: 1 reps." +- listitem: "the shape: 1 reps." +- listitem: "the markings: 1 reps." +- listitem: "markings the: 1 reps." +- listitem: "d think: 1 reps." +- listitem: "even the: 1 reps." +- listitem: "something': 1 reps." +- listitem: "their news: 1 reps." +- listitem: "bet that: 1 reps." +- listitem: "blame them: 1 reps." +- listitem: "But that: 1 reps." +- listitem: "Muggle clothes: 1 reps." +- listitem: "clothes,: 1 reps." +- listitem: "She threw: 1 reps." +- listitem: "though hoping: 1 reps." +- listitem: "her something: 1 reps." +- listitem: "something,: 1 reps." +- listitem: "fine thing: 1 reps." +- listitem: "thing it: 1 reps." +- listitem: "be thankful: 1 reps." +- listitem: "thankful for: 1 reps." +- listitem: "m rather: 1 reps." +- listitem: "rather fond: 1 reps." +- listitem: "think this: 1 reps." +- listitem: "this You-: 1 reps." +- listitem: "use them: 1 reps." +- listitem: "are nothing: 1 reps." +- listitem: "nothing next: 1 reps." +- listitem: "rumors that: 1 reps." +- listitem: "that are: 1 reps." +- listitem: "neither: 1 reps." +- listitem: "seemed that: 1 reps." +- listitem: "that Professor: 1 reps." +- listitem: "for neither: 1 reps." +- listitem: "neither as: 1 reps." +- listitem: "Dumbledore with: 1 reps." +- listitem: "plain that: 1 reps." +- listitem: "that whatever: 1 reps." +- listitem: "choosing another: 1 reps." +- listitem: "another lemon: 1 reps." +- listitem: "that last: 1 reps." +- listitem: "that Lily: 1 reps." +- listitem: "the shoulder: 1 reps." +- listitem: "kill the: 1 reps." +- listitem: "kill that: 1 reps." +- listitem: "that little: 1 reps." +- listitem: "that when: 1 reps." +- listitem: "eyes beneath: 1 reps." +- listitem: "beneath her: 1 reps." +- listitem: "though,: 1 reps." +- listitem: "mean the: 1 reps." +- listitem: "watching them: 1 reps." +- listitem: "got this: 1 reps." +- listitem: "this son: 1 reps." +- listitem: "mother all: 1 reps." +- listitem: "explain everything: 1 reps." +- listitem: "everything to: 1 reps." +- listitem: "written them: 1 reps." +- listitem: "them a: 1 reps." +- listitem: "this in: 1 reps." +- listitem: "? These: 1 reps." +- listitem: "the future: 1 reps." +- listitem: "there will: 1 reps." +- listitem: "that until: 1 reps." +- listitem: "underneath: 1 reps." +- listitem: "her mouth: 1 reps." +- listitem: "she thought: 1 reps." +- listitem: "Harry underneath: 1 reps." +- listitem: "underneath it: 1 reps." +- listitem: "with something: 1 reps." +- listitem: "something as: 1 reps." +- listitem: "as this: 1 reps." +- listitem: "with my: 1 reps." +- listitem: "broken the: 1 reps." +- listitem: "the silence: 1 reps." +- listitem: "they looked: 1 reps." +- listitem: "they both: 1 reps." +- listitem: "both looked: 1 reps." +- listitem: "the sky: 1 reps." +- listitem: "leather: 1 reps." +- listitem: "nothing to: 1 reps." +- listitem: "hands the: 1 reps." +- listitem: "the size: 1 reps." +- listitem: "their leather: 1 reps." +- listitem: "leather boots: 1 reps." +- listitem: "that motorcycle: 1 reps." +- listitem: "forehead they: 1 reps." +- listitem: "that where: 1 reps." +- listitem: "have that: 1 reps." +- listitem: "that scar: 1 reps." +- listitem: "do something: 1 reps." +- listitem: "something about: 1 reps." +- listitem: "knee that: 1 reps." +- listitem: "that is: 1 reps." +- listitem: "the London: 1 reps." +- listitem: "this over: 1 reps." +- listitem: "over with: 1 reps." +- listitem: "with.: 1 reps." +- listitem: "with Muggles: 1 reps." +- listitem: "the arm: 1 reps." +- listitem: "then came: 1 reps." +- listitem: "other two: 1 reps." +- listitem: "minute the: 1 reps." +- listitem: "the three: 1 reps." +- listitem: "three of: 1 reps." +- listitem: "them stood: 1 reps." +- listitem: "the little: 1 reps." +- listitem: "the twinkling: 1 reps." +- listitem: "light that: 1 reps." +- listitem: "that usually: 1 reps." +- listitem: "join the: 1 reps." +- listitem: "the celebrations: 1 reps." +- listitem: "this bike: 1 reps." +- listitem: "kicked the: 1 reps." +- listitem: "the engine: 1 reps." +- listitem: "; with: 1 reps." +- listitem: "their street: 1 reps." +- listitem: "that Privet: 1 reps." +- listitem: "the step: 1 reps." +- listitem: "ruffled the: 1 reps." +- listitem: "the neat: 1 reps." +- listitem: "the inky: 1 reps." +- listitem: "astonishing things: 1 reps." +- listitem: "blankets without: 1 reps." +- listitem: "without waking: 1 reps." +- listitem: "the milk: 1 reps." +- listitem: "nor that: 1 reps." +- listitem: "that at: 1 reps." +- listitem: "this very: 1 reps." +- listitem: "up their: 1 reps." +- listitem: "their glasses: 1 reps." +- listitem: "THE VANASHIG: 1 reps." +- listitem: "since the: 1 reps." +- listitem: "find their: 1 reps." +- listitem: "their nephew: 1 reps." +- listitem: "The sun: 1 reps." +- listitem: "the brass: 1 reps." +- listitem: "into their: 1 reps." +- listitem: "their living: 1 reps." +- listitem: "seen that: 1 reps." +- listitem: "that fateful: 1 reps." +- listitem: "the mantelpiece: 1 reps." +- listitem: "now the: 1 reps." +- listitem: "the fair: 1 reps." +- listitem: "game with: 1 reps." +- listitem: "that another: 1 reps." +- listitem: "another boy: 1 reps." +- listitem: "made the: 1 reps." +- listitem: "woke with: 1 reps." +- listitem: "then the: 1 reps." +- listitem: "the frying: 1 reps." +- listitem: "the stove: 1 reps." +- listitem: "remember the: 1 reps." +- listitem: "the dream: 1 reps." +- listitem: "after the: 1 reps." +- listitem: "want everything: 1 reps." +- listitem: "everything perfect: 1 reps." +- listitem: "snapped through: 1 reps." +- listitem: "\"Nothing: 1 reps." +- listitem: "Nothing,: 1 reps." +- listitem: "nothing ...: 1 reps." +- listitem: "birthday —: 1 reps." +- listitem: "put them: 1 reps." +- listitem: "them on: 1 reps." +- listitem: "hidden beneath: 1 reps." +- listitem: "beneath all: 1 reps." +- listitem: "birthday presents: 1 reps." +- listitem: "though Dudley: 1 reps." +- listitem: "gotten the: 1 reps." +- listitem: "mention the: 1 reps." +- listitem: "had something: 1 reps." +- listitem: "with living: 1 reps." +- listitem: "skinnier than: 1 reps." +- listitem: "clothes of: 1 reps." +- listitem: "bigger than: 1 reps." +- listitem: "a thin: 1 reps." +- listitem: "thin face: 1 reps." +- listitem: "held together: 1 reps." +- listitem: "together with: 1 reps." +- listitem: "the nose: 1 reps." +- listitem: "thing Harry: 1 reps." +- listitem: "very thin: 1 reps." +- listitem: "thin scar: 1 reps." +- listitem: "forehead that: 1 reps." +- listitem: "life with: 1 reps." +- listitem: "entered the: 1 reps." +- listitem: "shouted that: 1 reps." +- listitem: "haircuts than: 1 reps." +- listitem: "than the: 1 reps." +- listitem: "put together: 1 reps." +- listitem: "grew that: 1 reps." +- listitem: "that way: 1 reps." +- listitem: "smoothly: 1 reps." +- listitem: "kitchen with: 1 reps." +- listitem: "thick blond: 1 reps." +- listitem: "hair that: 1 reps." +- listitem: "that lay: 1 reps." +- listitem: "lay smoothly: 1 reps." +- listitem: "smoothly on: 1 reps." +- listitem: "the plates: 1 reps." +- listitem: "as there: 1 reps." +- listitem: "Thirty-six: 1 reps." +- listitem: "\"Thirty-six: 1 reps." +- listitem: "Thirty-six,: 1 reps." +- listitem: "than last: 1 reps." +- listitem: "under this: 1 reps." +- listitem: "this big: 1 reps." +- listitem: "thirty-seven: 1 reps." +- listitem: ", thirty-seven: 1 reps." +- listitem: "thirty-seven then: 1 reps." +- listitem: "the face: 1 reps." +- listitem: "you another: 1 reps." +- listitem: "another two: 1 reps." +- listitem: "thought for: 1 reps." +- listitem: "have thirty: 1 reps." +- listitem: "... thirty: 1 reps." +- listitem: "Thirty-nine: 1 reps." +- listitem: "\"Thirty-nine: 1 reps." +- listitem: "Thirty-nine,: 1 reps." +- listitem: "right then: 1 reps." +- listitem: "s worth: 1 reps." +- listitem: "worth,: 1 reps." +- listitem: "moment the: 1 reps." +- listitem: "unwrap the: 1 reps." +- listitem: "ripping the: 1 reps." +- listitem: "the paper: 1 reps." +- listitem: "looking both: 1 reps." +- listitem: "both angry: 1 reps." +- listitem: "s mouth: 1 reps." +- listitem: "mouth fell: 1 reps." +- listitem: "birthday,: 1 reps." +- listitem: "or the: 1 reps." +- listitem: "the movies: 1 reps." +- listitem: "behind with: 1 reps." +- listitem: "with Mrs: 1 reps." +- listitem: "it there: 1 reps." +- listitem: "planned this: 1 reps." +- listitem: "sorry that: 1 reps." +- listitem: "that Mrs: 1 reps." +- listitem: "hates the: 1 reps." +- listitem: "t there: 1 reps." +- listitem: "there —: 1 reps." +- listitem: "or rather: 1 reps." +- listitem: "rather,: 1 reps." +- listitem: "nasty that: 1 reps." +- listitem: "that couldn: 1 reps." +- listitem: "understand them: 1 reps." +- listitem: "that if: 1 reps." +- listitem: "mother would: 1 reps." +- listitem: "him anything: 1 reps." +- listitem: "spoils everything: 1 reps." +- listitem: "everything!: 1 reps." +- listitem: "grin through: 1 reps." +- listitem: "mothers arms: 1 reps." +- listitem: "Just then: 1 reps." +- listitem: "the doorbell: 1 reps." +- listitem: "in with: 1 reps." +- listitem: "boy with: 1 reps." +- listitem: "usually the: 1 reps." +- listitem: "the one: 1 reps." +- listitem: "behind their: 1 reps." +- listitem: "their backs: 1 reps." +- listitem: "hit them: 1 reps." +- listitem: "car with: 1 reps." +- listitem: "with Piers: 1 reps." +- listitem: "of anything: 1 reps." +- listitem: "anything else: 1 reps." +- listitem: ", anything: 1 reps." +- listitem: "anything at: 1 reps." +- listitem: "that cupboard: 1 reps." +- listitem: "The problem: 1 reps." +- listitem: "strange things: 1 reps." +- listitem: "things often: 1 reps." +- listitem: "make them: 1 reps." +- listitem: "them happen: 1 reps." +- listitem: "the barbers: 1 reps." +- listitem: "hide that: 1 reps." +- listitem: "that horrible: 1 reps." +- listitem: "school the: 1 reps." +- listitem: "baggy clothes: 1 reps." +- listitem: "for this: 1 reps." +- listitem: "even though: 1 reps." +- listitem: "explain that: 1 reps." +- listitem: "Another time: 1 reps." +- listitem: "brown with: 1 reps." +- listitem: "with orange: 1 reps." +- listitem: "The harder: 1 reps." +- listitem: "the smaller: 1 reps." +- listitem: "the wash: 1 reps." +- listitem: "there he: 1 reps." +- listitem: "the chimney: 1 reps." +- listitem: "them Harry: 1 reps." +- listitem: "Vernon through: 1 reps." +- listitem: "the locked: 1 reps." +- listitem: "supposed that: 1 reps." +- listitem: "nothing was: 1 reps." +- listitem: "even worth: 1 reps." +- listitem: "worth being: 1 reps." +- listitem: "somewhere that: 1 reps." +- listitem: "that wasn: 1 reps." +- listitem: "about things: 1 reps." +- listitem: "things:: 1 reps." +- listitem: "the council: 1 reps." +- listitem: "the bank: 1 reps." +- listitem: "This morning: 1 reps." +- listitem: "the young: 1 reps." +- listitem: "overtook them: 1 reps." +- listitem: "beet with: 1 reps." +- listitem: "know they: 1 reps." +- listitem: "said anything: 1 reps." +- listitem: "If there: 1 reps." +- listitem: "thing the: 1 reps." +- listitem: "more than: 1 reps." +- listitem: "than his: 1 reps." +- listitem: "anything acting: 1 reps." +- listitem: "— they: 1 reps." +- listitem: "crowded with: 1 reps." +- listitem: "with families: 1 reps." +- listitem: "either: 1 reps." +- listitem: "the entrance: 1 reps." +- listitem: "the smiling: 1 reps." +- listitem: "the van: 1 reps." +- listitem: "they bought: 1 reps." +- listitem: ", either: 1 reps." +- listitem: "either,: 1 reps." +- listitem: "thought,: 1 reps." +- listitem: "they watched: 1 reps." +- listitem: "except that: 1 reps." +- listitem: "bored with: 1 reps." +- listitem: "the animals: 1 reps." +- listitem: "their favorite: 1 reps." +- listitem: "him another: 1 reps." +- listitem: "finish the: 1 reps." +- listitem: "pythons: 1 reps." +- listitem: "lunch they: 1 reps." +- listitem: "with lit: 1 reps." +- listitem: "along the: 1 reps." +- listitem: "and slithering: 1 reps." +- listitem: "slithering over: 1 reps." +- listitem: "man-crushing pythons: 1 reps." +- listitem: "pythons.: 1 reps." +- listitem: "the largest: 1 reps." +- listitem: "the mood: 1 reps." +- listitem: "stood with: 1 reps." +- listitem: "the glistening: 1 reps." +- listitem: "rapped the: 1 reps." +- listitem: "smartly with: 1 reps." +- listitem: "\"This: 1 reps." +- listitem: "the tank: 1 reps." +- listitem: "drumming their: 1 reps." +- listitem: "their fingers: 1 reps." +- listitem: "than having: 1 reps." +- listitem: "level with: 1 reps." +- listitem: ", then: 1 reps." +- listitem: "then raised: 1 reps." +- listitem: "look that: 1 reps." +- listitem: "murmured through: 1 reps." +- listitem: "nice there: 1 reps." +- listitem: ": This: 1 reps." +- listitem: "This specimen: 1 reps." +- listitem: "made both: 1 reps." +- listitem: "them jump: 1 reps." +- listitem: "THIS SNAKE: 1 reps." +- listitem: "toward them: 1 reps." +- listitem: "the ribs: 1 reps." +- listitem: "the concrete: 1 reps." +- listitem: "back with: 1 reps." +- listitem: "with howls: 1 reps." +- listitem: "throughout: 1 reps." +- listitem: ", slithering: 1 reps." +- listitem: "slithering out: 1 reps." +- listitem: "People throughout: 1 reps." +- listitem: "throughout the: 1 reps." +- listitem: "the exits: 1 reps." +- listitem: "Thanksss: 1 reps." +- listitem: "... Thanksss: 1 reps." +- listitem: "Thanksss,: 1 reps." +- listitem: "did the: 1 reps." +- listitem: "death: 1 reps." +- listitem: "done anything: 1 reps." +- listitem: "anything except: 1 reps." +- listitem: "at their: 1 reps." +- listitem: "their heels: 1 reps." +- listitem: "them how: 1 reps." +- listitem: "to death: 1 reps." +- listitem: "death.: 1 reps." +- listitem: "Until they: 1 reps." +- listitem: "the crash: 1 reps." +- listitem: "thought (: 1 reps." +- listitem: ") that: 1 reps." +- listitem: "that strangers: 1 reps." +- listitem: "strangers they: 1 reps." +- listitem: "shopping with: 1 reps." +- listitem: "with Aunt: 1 reps." +- listitem: "knew the: 1 reps." +- listitem: "rushed them: 1 reps." +- listitem: "them out: 1 reps." +- listitem: "the shop: 1 reps." +- listitem: "shop without: 1 reps." +- listitem: "without buying: 1 reps." +- listitem: "buying anything: 1 reps." +- listitem: "street the: 1 reps." +- listitem: "other day: 1 reps." +- listitem: "then walked: 1 reps." +- listitem: "away without: 1 reps." +- listitem: "The weirdest: 1 reps." +- listitem: "weirdest thing: 1 reps." +- listitem: "thing about: 1 reps." +- listitem: "way they: 1 reps." +- listitem: "vanish the: 1 reps." +- listitem: "hated that: 1 reps." +- listitem: "that odd: 1 reps." +- listitem: "disagree with: 1 reps." +- listitem: "The escape: 1 reps." +- listitem: "the Brazilian: 1 reps." +- listitem: "the summer: 1 reps." +- listitem: "the lot: 1 reps." +- listitem: "the leader: 1 reps." +- listitem: "them were: 1 reps." +- listitem: "and thinking: 1 reps." +- listitem: "the holidays: 1 reps." +- listitem: "going there: 1 reps." +- listitem: "there too: 1 reps." +- listitem: "the local: 1 reps." +- listitem: "\"They: 1 reps." +- listitem: "They stuff: 1 reps." +- listitem: "the toilet: 1 reps." +- listitem: "toilet the: 1 reps." +- listitem: "thanks,: 1 reps." +- listitem: "The poor: 1 reps." +- listitem: "had anything: 1 reps." +- listitem: "anything as: 1 reps." +- listitem: "cake that: 1 reps." +- listitem: "that tasted: 1 reps." +- listitem: "other while: 1 reps." +- listitem: "the teachers: 1 reps." +- listitem: "gruffly that: 1 reps." +- listitem: "the proudest: 1 reps." +- listitem: "thought two: 1 reps." +- listitem: "kitchen the: 1 reps." +- listitem: "the sink: 1 reps." +- listitem: "The tub: 1 reps." +- listitem: "s this: 1 reps." +- listitem: "they always: 1 reps." +- listitem: "the bowl: 1 reps." +- listitem: "old things: 1 reps." +- listitem: "things gray: 1 reps." +- listitem: "doubted this: 1 reps." +- listitem: "thought it: 1 reps." +- listitem: "both with: 1 reps." +- listitem: "with wrinkled: 1 reps." +- listitem: "the smell: 1 reps." +- listitem: "the click: 1 reps." +- listitem: "him with: 1 reps." +- listitem: "with your: 1 reps." +- listitem: "dodged the: 1 reps." +- listitem: ". Three: 1 reps." +- listitem: "Three things: 1 reps." +- listitem: "things lay: 1 reps." +- listitem: "the Isle: 1 reps." +- listitem: "envelope that: 1 reps." +- listitem: "no other: 1 reps." +- listitem: "other relatives: 1 reps." +- listitem: "the library: 1 reps." +- listitem: "plainly there: 1 reps." +- listitem: "there could: 1 reps." +- listitem: "was thick: 1 reps." +- listitem: "thick and: 1 reps." +- listitem: "Vernon the: 1 reps." +- listitem: "the yellow: 1 reps." +- listitem: "got something: 1 reps." +- listitem: "something!: 1 reps." +- listitem: "Within: 1 reps." +- listitem: "shaking the: 1 reps." +- listitem: "open with: 1 reps." +- listitem: "with one: 1 reps." +- listitem: "faster than: 1 reps." +- listitem: "than a: 1 reps." +- listitem: "stop there: 1 reps." +- listitem: ". Within: 1 reps." +- listitem: "Within seconds: 1 reps." +- listitem: "the grayish: 1 reps." +- listitem: "her throat: 1 reps." +- listitem: "throat and: 1 reps." +- listitem: "They stared: 1 reps." +- listitem: "other,: 1 reps." +- listitem: "father a: 1 reps." +- listitem: "head with: 1 reps." +- listitem: "read that: 1 reps." +- listitem: "stuffing the: 1 reps." +- listitem: "took both: 1 reps." +- listitem: "both Harry: 1 reps." +- listitem: "the scruffs: 1 reps." +- listitem: "threw them: 1 reps." +- listitem: "the keyhole: 1 reps." +- listitem: "could they: 1 reps." +- listitem: "they possibly: 1 reps." +- listitem: "them we: 1 reps." +- listitem: "that dangerous: 1 reps." +- listitem: "did something: 1 reps." +- listitem: "squeezed through: 1 reps." +- listitem: "then forced: 1 reps." +- listitem: "this cupboard: 1 reps." +- listitem: "we think: 1 reps." +- listitem: "Take this: 1 reps." +- listitem: "this stuff: 1 reps." +- listitem: "month-old: 1 reps." +- listitem: "the toys: 1 reps." +- listitem: "and things: 1 reps." +- listitem: "that wouldn: 1 reps." +- listitem: "move everything: 1 reps." +- listitem: "everything he: 1 reps." +- listitem: "to this: 1 reps." +- listitem: "this room: 1 reps." +- listitem: "Nearly everything: 1 reps." +- listitem: "everything in: 1 reps." +- listitem: "The month-old: 1 reps." +- listitem: "month-old video: 1 reps." +- listitem: "foot through: 1 reps." +- listitem: "through when: 1 reps." +- listitem: "; there: 1 reps." +- listitem: "parrot that: 1 reps." +- listitem: "shelf with: 1 reps." +- listitem: ". Other: 1 reps." +- listitem: "Other shelves: 1 reps." +- listitem: "things in: 1 reps." +- listitem: "room that: 1 reps." +- listitem: "though they: 1 reps." +- listitem: "came the: 1 reps." +- listitem: "there ...: 1 reps." +- listitem: "need that: 1 reps." +- listitem: "that room: 1 reps." +- listitem: "given anything: 1 reps." +- listitem: "d rather: 1 reps." +- listitem: "rather be: 1 reps." +- listitem: "cupboard with: 1 reps." +- listitem: "letter than: 1 reps." +- listitem: "than up: 1 reps." +- listitem: "here without: 1 reps." +- listitem: "without it: 1 reps." +- listitem: "thrown: 1 reps." +- listitem: "was rather: 1 reps." +- listitem: "rather quiet: 1 reps." +- listitem: "father with: 1 reps." +- listitem: "and thrown: 1 reps." +- listitem: "thrown his: 1 reps." +- listitem: "tortoise through: 1 reps." +- listitem: "the greenhouse: 1 reps." +- listitem: "was thinking: 1 reps." +- listitem: "other darkly: 1 reps." +- listitem: "banging things: 1 reps." +- listitem: "things with: 1 reps." +- listitem: "\"There: 1 reps." +- listitem: "s another: 1 reps." +- listitem: "The Smallest: 1 reps." +- listitem: "the fact: 1 reps." +- listitem: "fact that: 1 reps." +- listitem: "the neck: 1 reps." +- listitem: "for breath: 1 reps." +- listitem: "breath,: 1 reps." +- listitem: "that meant: 1 reps." +- listitem: "meant they: 1 reps." +- listitem: "sure they: 1 reps." +- listitem: "The repaired: 1 reps." +- listitem: "clock the: 1 reps." +- listitem: "downstairs without: 1 reps." +- listitem: "without turning: 1 reps." +- listitem: "the postman: 1 reps." +- listitem: "on something: 1 reps." +- listitem: "something big: 1 reps." +- listitem: "— something: 1 reps." +- listitem: "something alive: 1 reps." +- listitem: "squashy something: 1 reps." +- listitem: "something had: 1 reps." +- listitem: "the foot: 1 reps." +- listitem: "then told: 1 reps." +- listitem: "see three: 1 reps." +- listitem: "three letters: 1 reps." +- listitem: "tearing the: 1 reps." +- listitem: "work that: 1 reps." +- listitem: "a mouthful: 1 reps." +- listitem: "mouthful of: 1 reps." +- listitem: "they can: 1 reps." +- listitem: "deliver them: 1 reps." +- listitem: "them they: 1 reps." +- listitem: ", these: 1 reps." +- listitem: "nail with: 1 reps." +- listitem: "the piece: 1 reps." +- listitem: "than twelve: 1 reps." +- listitem: "go through: 1 reps." +- listitem: "slot they: 1 reps." +- listitem: "slotted through: 1 reps." +- listitem: "the sides: 1 reps." +- listitem: "forced through: 1 reps." +- listitem: "the small: 1 reps." +- listitem: "the downstairs: 1 reps." +- listitem: "downstairs bathroom: 1 reps." +- listitem: "bathroom.: 1 reps." +- listitem: "Tiptoe Through: 1 reps." +- listitem: "the Tulips: 1 reps." +- listitem: ", things: 1 reps." +- listitem: "things began: 1 reps." +- listitem: "found their: 1 reps." +- listitem: "the two: 1 reps." +- listitem: "eggs that: 1 reps." +- listitem: "that their: 1 reps." +- listitem: "their very: 1 reps." +- listitem: "the post: 1 reps." +- listitem: "the dairy: 1 reps." +- listitem: "shredded the: 1 reps." +- listitem: "earth: 1 reps." +- listitem: "on earth: 1 reps." +- listitem: "earth wants: 1 reps." +- listitem: "you this: 1 reps." +- listitem: "this badly: 1 reps." +- listitem: "the breakfast: 1 reps." +- listitem: "and rather: 1 reps." +- listitem: "rather ill: 1 reps." +- listitem: "reminded them: 1 reps." +- listitem: "them cheerfully: 1 reps." +- listitem: "Something came: 1 reps." +- listitem: ", thirty: 1 reps." +- listitem: "thirty or: 1 reps." +- listitem: "the waist: 1 reps." +- listitem: "threw him: 1 reps." +- listitem: "with their: 1 reps." +- listitem: "their arms: 1 reps." +- listitem: "over their: 1 reps." +- listitem: "hear the: 1 reps." +- listitem: "That does: 1 reps." +- listitem: "some clothes: 1 reps." +- listitem: "clothes.: 1 reps." +- listitem: "dangerous with: 1 reps." +- listitem: "with half: 1 reps." +- listitem: "missing that: 1 reps." +- listitem: "that no: 1 reps." +- listitem: "later they: 1 reps." +- listitem: "wrenched their: 1 reps." +- listitem: "way through: 1 reps." +- listitem: "the boarded-up: 1 reps." +- listitem: "the highway: 1 reps." +- listitem: "father had: 1 reps." +- listitem: "round the: 1 reps." +- listitem: "holding them: 1 reps." +- listitem: "them up: 1 reps." +- listitem: "where they: 1 reps." +- listitem: "then Uncle: 1 reps." +- listitem: "the opposite: 1 reps." +- listitem: "did this: 1 reps." +- listitem: "long without: 1 reps." +- listitem: "without blowing: 1 reps." +- listitem: "the outskirts: 1 reps." +- listitem: "room with: 1 reps." +- listitem: "with twin: 1 reps." +- listitem: "the windowsill: 1 reps." +- listitem: "breakfast the: 1 reps." +- listitem: "the owner: 1 reps." +- listitem: "the hotel: 1 reps." +- listitem: "their table: 1 reps." +- listitem: "these at: 1 reps." +- listitem: "so they: 1 reps." +- listitem: "Cokeworth: 1 reps." +- listitem: "The woman: 1 reps." +- listitem: "take them: 1 reps." +- listitem: "the dining: 1 reps." +- listitem: "them knew: 1 reps." +- listitem: "drove them: 1 reps." +- listitem: "off they: 1 reps." +- listitem: "same thing: 1 reps." +- listitem: "late that: 1 reps." +- listitem: "the coast: 1 reps." +- listitem: "locked them: 1 reps." +- listitem: "somewhere with: 1 reps." +- listitem: "eleventh: 1 reps." +- listitem: "This reminded: 1 reps." +- listitem: "know the: 1 reps." +- listitem: "the week: 1 reps." +- listitem: "then tomorrow: 1 reps." +- listitem: "s eleventh: 1 reps." +- listitem: "eleventh birthday: 1 reps." +- listitem: "birthdays were: 1 reps." +- listitem: "the perfect: 1 reps." +- listitem: "the most: 1 reps." +- listitem: "thing was: 1 reps." +- listitem: "this gentleman: 1 reps." +- listitem: "toothless: 1 reps." +- listitem: "A toothless: 1 reps." +- listitem: "toothless old: 1 reps." +- listitem: "rather wicked: 1 reps." +- listitem: "the iron-gray: 1 reps." +- listitem: "below them: 1 reps." +- listitem: "the boat: 1 reps." +- listitem: "down their: 1 reps." +- listitem: "whipped their: 1 reps." +- listitem: "hours they: 1 reps." +- listitem: "they reached: 1 reps." +- listitem: "led the: 1 reps." +- listitem: "the broken-down: 1 reps." +- listitem: "The inside: 1 reps." +- listitem: "whistled through: 1 reps." +- listitem: "the wooden: 1 reps." +- listitem: "with some: 1 reps." +- listitem: "of those: 1 reps." +- listitem: "thought nobody: 1 reps." +- listitem: "reaching them: 1 reps." +- listitem: "them here: 1 reps." +- listitem: "though the: 1 reps." +- listitem: "the thought: 1 reps." +- listitem: "thought didn: 1 reps." +- listitem: "filthy: 1 reps." +- listitem: "moth-eaten: 1 reps." +- listitem: "thinnest: 1 reps." +- listitem: "the promised: 1 reps." +- listitem: "the high: 1 reps." +- listitem: "splattered the: 1 reps." +- listitem: "rattled the: 1 reps." +- listitem: "the filthy: 1 reps." +- listitem: "filthy windows: 1 reps." +- listitem: "the moth-eaten: 1 reps." +- listitem: "moth-eaten sofa: 1 reps." +- listitem: "the lumpy: 1 reps." +- listitem: "the softest: 1 reps." +- listitem: "the thinnest: 1 reps." +- listitem: "thinnest,: 1 reps." +- listitem: "rumbling with: 1 reps." +- listitem: "with hunger: 1 reps." +- listitem: "of thunder: 1 reps." +- listitem: "thunder that: 1 reps." +- listitem: "that started: 1 reps." +- listitem: "birthday tick: 1 reps." +- listitem: "heard something: 1 reps." +- listitem: "something creak: 1 reps." +- listitem: "hoped the: 1 reps." +- listitem: "Maybe the: 1 reps." +- listitem: "when they: 1 reps." +- listitem: "back that: 1 reps." +- listitem: "Three minutes: 1 reps." +- listitem: "that funny: 1 reps." +- listitem: ". Thirty: 1 reps." +- listitem: "Thirty seconds: 1 reps." +- listitem: "— three: 1 reps." +- listitem: "three ...: 1 reps." +- listitem: "THE KEYS: 1 reps." +- listitem: "They knocked: 1 reps." +- listitem: "the cannon: 1 reps." +- listitem: "now they: 1 reps." +- listitem: "they knew: 1 reps." +- listitem: "the long: 1 reps." +- listitem: "brought with: 1 reps." +- listitem: "with them: 1 reps." +- listitem: "s there: 1 reps." +- listitem: "hit with: 1 reps." +- listitem: "force that: 1 reps." +- listitem: "the doorway: 1 reps." +- listitem: "the hair: 1 reps." +- listitem: "that his: 1 reps." +- listitem: "brushed the: 1 reps." +- listitem: "The noise: 1 reps." +- listitem: "at them: 1 reps." +- listitem: "frozen with: 1 reps." +- listitem: "with fear: 1 reps." +- listitem: "the stranger: 1 reps." +- listitem: "the fierce: 1 reps." +- listitem: "the beetle: 1 reps." +- listitem: "demand that: 1 reps." +- listitem: "jerked the: 1 reps." +- listitem: "the gun: 1 reps." +- listitem: "made another: 1 reps." +- listitem: "another funny: 1 reps." +- listitem: "birthday to: 1 reps." +- listitem: "it with: 1 reps." +- listitem: "with trembling: 1 reps." +- listitem: "cake with: 1 reps." +- listitem: "with Happy: 1 reps." +- listitem: "Birthday Harry: 1 reps." +- listitem: "say thank: 1 reps." +- listitem: "the words: 1 reps." +- listitem: "that tea: 1 reps." +- listitem: "tea then: 1 reps." +- listitem: "bath: 1 reps." +- listitem: "grate with: 1 reps." +- listitem: "the shriveled: 1 reps." +- listitem: "fire there: 1 reps." +- listitem: "hut with: 1 reps." +- listitem: "with flickering: 1 reps." +- listitem: "felt the: 1 reps." +- listitem: "the warmth: 1 reps." +- listitem: "warmth wash: 1 reps." +- listitem: "hot bath: 1 reps." +- listitem: "bath.: 1 reps." +- listitem: "of things: 1 reps." +- listitem: "things out: 1 reps." +- listitem: "liquid that: 1 reps." +- listitem: "Soon the: 1 reps." +- listitem: "a thing: 1 reps." +- listitem: "thing while: 1 reps." +- listitem: "slid the: 1 reps." +- listitem: "the poker: 1 reps." +- listitem: "touch anything: 1 reps." +- listitem: "passed the: 1 reps." +- listitem: "the sausages: 1 reps." +- listitem: "tasted anything: 1 reps." +- listitem: "anything so: 1 reps." +- listitem: "explain anything: 1 reps." +- listitem: "mouth with: 1 reps." +- listitem: "the shadows: 1 reps." +- listitem: "never thought: 1 reps." +- listitem: "thought yeh: 1 reps." +- listitem: "Hagrid thundered: 1 reps." +- listitem: "thundered.: 1 reps." +- listitem: "nothin: 1 reps." +- listitem: "knows nothin: 1 reps." +- listitem: "nothin': 1 reps." +- listitem: "ANYTHING?: 1 reps." +- listitem: "math: 1 reps." +- listitem: "some things: 1 reps." +- listitem: "do math: 1 reps." +- listitem: "math and: 1 reps." +- listitem: "whispered something: 1 reps." +- listitem: "something that: 1 reps." +- listitem: "that sounded: 1 reps." +- listitem: "were they: 1 reps." +- listitem: "they?: 1 reps." +- listitem: "fingers through: 1 reps." +- listitem: "through his: 1 reps." +- listitem: "right there: 1 reps." +- listitem: "boy anything: 1 reps." +- listitem: "anything!: 1 reps." +- listitem: "man than: 1 reps." +- listitem: "than Vernon: 1 reps." +- listitem: "the furious: 1 reps." +- listitem: "trembled with: 1 reps." +- listitem: "with rage: 1 reps." +- listitem: "was there: 1 reps." +- listitem: "there!: 1 reps." +- listitem: "these years: 1 reps." +- listitem: "the whistling: 1 reps." +- listitem: "thumpin: 1 reps." +- listitem: "a thumpin: 1 reps." +- listitem: "thumpin': 1 reps." +- listitem: "Hut-on-the-Rock: 1 reps." +- listitem: "take the: 1 reps." +- listitem: "the yellowish: 1 reps." +- listitem: ", Hut-on-the-Rock: 1 reps." +- listitem: "Hut-on-the-Rock,: 1 reps." +- listitem: "you that: 1 reps." +- listitem: "later than: 1 reps." +- listitem: "than July: 1 reps." +- listitem: "they await: 1 reps." +- listitem: "teeth: 1 reps." +- listitem: "that reminds: 1 reps." +- listitem: "forehead with: 1 reps." +- listitem: "with enough: 1 reps." +- listitem: "yet another: 1 reps." +- listitem: "another pocket: 1 reps." +- listitem: ", rather: 1 reps." +- listitem: "rather ruffled-looking: 1 reps." +- listitem: "his teeth: 1 reps." +- listitem: "teeth he: 1 reps." +- listitem: "note that: 1 reps." +- listitem: "his things: 1 reps." +- listitem: "things tomorrow: 1 reps." +- listitem: "Weather': 1 reps." +- listitem: "the note: 1 reps." +- listitem: "threw the: 1 reps." +- listitem: "though this: 1 reps." +- listitem: "mouth was: 1 reps." +- listitem: "the firelight: 1 reps." +- listitem: "like them: 1 reps." +- listitem: "that rubbish: 1 reps." +- listitem: "that and: 1 reps." +- listitem: "that —: 1 reps." +- listitem: "that school: 1 reps." +- listitem: "vacation with: 1 reps." +- listitem: "my mother: 1 reps." +- listitem: "Lily this: 1 reps." +- listitem: "this and: 1 reps." +- listitem: "Lily that: 1 reps." +- listitem: "then went: 1 reps." +- listitem: "this for: 1 reps." +- listitem: "Then she: 1 reps." +- listitem: "met that: 1 reps." +- listitem: "that Potter: 1 reps." +- listitem: "they left: 1 reps." +- listitem: "just the: 1 reps." +- listitem: "landed with: 1 reps." +- listitem: "with you: 1 reps." +- listitem: "me they: 1 reps." +- listitem: "they died: 1 reps." +- listitem: "angrily that: 1 reps." +- listitem: "their corner: 1 reps." +- listitem: "The anger: 1 reps." +- listitem: "expected this: 1 reps." +- listitem: "me there: 1 reps." +- listitem: "there might: 1 reps." +- listitem: "m the: 1 reps." +- listitem: "He threw: 1 reps." +- listitem: "everythin: 1 reps." +- listitem: "yeh everythin: 1 reps." +- listitem: "everythin': 1 reps." +- listitem: "with —: 1 reps." +- listitem: "— with: 1 reps." +- listitem: "than worse: 1 reps." +- listitem: "this —: 1 reps." +- listitem: "friendly with: 1 reps." +- listitem: "with strange: 1 reps." +- listitem: "terrible things: 1 reps." +- listitem: "anythin: 1 reps." +- listitem: "their day: 1 reps." +- listitem: "Suppose the: 1 reps." +- listitem: "the myst: 1 reps." +- listitem: "want anythin: 1 reps." +- listitem: "anythin': 1 reps." +- listitem: "outta the: 1 reps." +- listitem: "the village: 1 reps." +- listitem: "nose with: 1 reps." +- listitem: "that sad: 1 reps." +- listitem: "' this: 1 reps." +- listitem: "thing —: 1 reps." +- listitem: "by then: 1 reps." +- listitem: "got that: 1 reps." +- listitem: "that mark: 1 reps." +- listitem: "? That: 1 reps." +- listitem: "the age: 1 reps." +- listitem: "the McKinnons: 1 reps." +- listitem: "the Bones: 1 reps." +- listitem: "the Prewetts: 1 reps." +- listitem: "again the: 1 reps." +- listitem: "the blinding: 1 reps." +- listitem: "clearly than: 1 reps." +- listitem: "remembered something: 1 reps." +- listitem: "the ruined: 1 reps." +- listitem: "ter this: 1 reps." +- listitem: "this lot: 1 reps." +- listitem: "accept there: 1 reps." +- listitem: "s something: 1 reps." +- listitem: "something strange: 1 reps." +- listitem: "nothing a: 1 reps." +- listitem: "this about: 1 reps." +- listitem: "off without: 1 reps." +- listitem: "without them: 1 reps." +- listitem: "all they: 1 reps." +- listitem: "with these: 1 reps." +- listitem: "these wizarding: 1 reps." +- listitem: "Pointing this: 1 reps." +- listitem: "this at: 1 reps." +- listitem: ", breathing: 1 reps." +- listitem: "breathing heavily: 1 reps." +- listitem: "which this: 1 reps." +- listitem: "reckon they: 1 reps." +- listitem: "there somewhere: 1 reps." +- listitem: "Cause somethin: 1 reps." +- listitem: "was somethin: 1 reps." +- listitem: "on that: 1 reps." +- listitem: "that night: 1 reps." +- listitem: "but somethin: 1 reps." +- listitem: "with warmth: 1 reps." +- listitem: "warmth and: 1 reps." +- listitem: "t they: 1 reps." +- listitem: "they been: 1 reps." +- listitem: "defeated the: 1 reps." +- listitem: "made things: 1 reps." +- listitem: "odd thing: 1 reps." +- listitem: "that had: 1 reps." +- listitem: "furious with: 1 reps." +- listitem: "their reach: 1 reps." +- listitem: "school with: 1 reps." +- listitem: "that ridiculous: 1 reps." +- listitem: ", without: 1 reps." +- listitem: "without even: 1 reps." +- listitem: "that Hagrid: 1 reps." +- listitem: "in without: 1 reps." +- listitem: "read those: 1 reps." +- listitem: "ter the: 1 reps." +- listitem: "the finest: 1 reps." +- listitem: "years there: 1 reps." +- listitem: "there and: 1 reps." +- listitem: "with youngsters: 1 reps." +- listitem: "he thundered: 1 reps." +- listitem: "thundered,: 1 reps." +- listitem: "brought the: 1 reps." +- listitem: "the umbrella: 1 reps." +- listitem: "down through: 1 reps." +- listitem: "spot with: 1 reps." +- listitem: "on them: 1 reps." +- listitem: "poking through: 1 reps." +- listitem: "other room: 1 reps." +- listitem: "anyway there: 1 reps." +- listitem: "mention that: 1 reps." +- listitem: "that ter: 1 reps." +- listitem: "the reasons: 1 reps." +- listitem: "the job: 1 reps." +- listitem: "truth: 1 reps." +- listitem: "third: 1 reps." +- listitem: "yeh the: 1 reps." +- listitem: "the truth: 1 reps." +- listitem: "truth.: 1 reps." +- listitem: "me third: 1 reps." +- listitem: "third year: 1 reps." +- listitem: "They snapped: 1 reps." +- listitem: "' everything: 1 reps." +- listitem: "everything.: 1 reps." +- listitem: "thick black: 1 reps." +- listitem: "under that: 1 reps." +- listitem: "early the: 1 reps." +- text: "/the Dursleys : \\d+ reps\\./" +- table /id-table-\d+-nth/: + - rowgroup: + - row /id-table-\d+-row-0-nth/: + - cell /id-table-\d+-row-0-nth-link/ + - row /id-table-\d+-row-1-nth/: + - cell /id-table-\d+-row-1-nth-link/ + - row /id-table-\d+-row-2-nth/: + - cell /id-table-\d+-row-2-nth-link/ + - row /id-table-\d+-row-3-nth/: + - cell /id-table-\d+-row-3-nth-link/ + - row /id-table-\d+-row-4-nth/: + - cell /id-table-\d+-row-4-nth-link/ + - row /id-table-\d+-row-5-nth/: + - cell /id-table-\d+-row-5-nth-link/: back at the Dursleys' dark + - row /id-table-\d+-row-6-nth/: + - cell /id-table-\d+-row-6-nth-link/ + - row /id-table-\d+-row-7-nth/: + - cell /id-table-\d+-row-7-nth-link/ + - row /id-table-\d+-row-8-nth/: + - cell /id-table-\d+-row-8-nth-link/: four on the Dursleys' front + - row /id-table-\d+-row-9-nth/: + - cell /id-table-\d+-row-9-nth-link/ + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/ + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/ + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/ + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/ + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/ + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/ + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/ + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/ + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/ + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/ + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/ + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/ + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/: bullets. The Dursleys ducked, + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/ + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/ + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/: back on the Dursleys, "a very + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/ + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/ + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/ + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/ + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/ + - row /id-table-\d+-row-\d+-nth/: + - cell /id-table-\d+-row-\d+-nth-link/ \ No newline at end of file diff --git a/static/tests/test-classic-landscape-ipad-mini-1-lite.koboldai.net.spec.ts b/static/tests/test-classic-landscape-ipad-mini-1-lite.koboldai.net.spec.ts index 9aeafb0f0f56f0e28a7fa3a53e51715a1b002004..a394dfe023484d9abbb73784151ef2dd4ed31b22 100644 --- a/static/tests/test-classic-landscape-ipad-mini-1-lite.koboldai.net.spec.ts +++ b/static/tests/test-classic-landscape-ipad-mini-1-lite.koboldai.net.spec.ts @@ -1,4 +1,5 @@ import { test, expect } from '@playwright/test'; +import { uploadFileWithPageAndFilepath } from './test-helper'; const testStoryJsonTxt = `${import.meta.dirname}/../../tests/events/very_long_text.json` const orderSelectionValues = ["asc", "desc"] @@ -12,15 +13,7 @@ test('test My Ghost Writer, ipad mini landscape: order/sort', async ({ page }) = await page.getByRole('button', { name: 'Set UI' }).click(); // 3. Upload a saved JSON story file to provide long text content for analysis - console.log(`preparing uploading of file '${testStoryJsonTxt}'!`) - await page.getByRole('link', { name: 'Save / Load' }).click(); - await page.waitForTimeout(100) - const fileChooserPromise = page.waitForEvent('filechooser'); - await page.getByRole('button', { name: '📁 Open File' }).click(); - const fileChooser = await fileChooserPromise; - await fileChooser.setFiles(testStoryJsonTxt); - await page.waitForTimeout(300) - console.log(`file '${testStoryJsonTxt}' uploaded!`) + await uploadFileWithPageAndFilepath(page, testStoryJsonTxt) // 4. Activate "My Ghost Writer" / text stats functionality via settings await page.getByRole('link', { name: 'Settings' }).click(); @@ -63,7 +56,7 @@ test('test My Ghost Writer, ipad mini landscape: order/sort', async ({ page }) = await page.getByRole('searchbox', { name: 'filter-words-frequency' }).press('Enter'); await page.waitForTimeout(300) // Assert that the list of words container matches the expected ARIA snapshot for this combination - await expect(page.getByLabel('id-list-of-words-container')).toMatchAriaSnapshot({ name: `test-classic-landscape-ipad-mini-1--${currentOrderSelectionValue}-${currentSortSelectionValue}.txt` }); + await expect(page.getByLabel('id-list-of-words-container')).toMatchAriaSnapshot({ name: `test-classic-landscape-ipad-mini-1--${currentOrderSelectionValue}-${currentSortSelectionValue}--id-list-of-words-container.txt` }); } } // End of test diff --git a/static/tests/test-classic-landscape-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-ipad-mini-1--asc-count.txt b/static/tests/test-classic-landscape-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-ipad-mini-1--asc-count--id-list-of-words-container.txt similarity index 100% rename from static/tests/test-classic-landscape-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-ipad-mini-1--asc-count.txt rename to static/tests/test-classic-landscape-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-ipad-mini-1--asc-count--id-list-of-words-container.txt diff --git a/static/tests/test-classic-landscape-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-ipad-mini-1--asc-n-words-ngram.txt b/static/tests/test-classic-landscape-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-ipad-mini-1--asc-n-words-ngram--id-list-of-words-container.txt similarity index 100% rename from static/tests/test-classic-landscape-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-ipad-mini-1--asc-n-words-ngram.txt rename to static/tests/test-classic-landscape-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-ipad-mini-1--asc-n-words-ngram--id-list-of-words-container.txt diff --git a/static/tests/test-classic-landscape-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-ipad-mini-1--asc-word-prefix.txt b/static/tests/test-classic-landscape-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-ipad-mini-1--asc-word-prefix--id-list-of-words-container.txt similarity index 100% rename from static/tests/test-classic-landscape-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-ipad-mini-1--asc-word-prefix.txt rename to static/tests/test-classic-landscape-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-ipad-mini-1--asc-word-prefix--id-list-of-words-container.txt diff --git a/static/tests/test-classic-landscape-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-ipad-mini-1--desc-count.txt b/static/tests/test-classic-landscape-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-ipad-mini-1--desc-count--id-list-of-words-container.txt similarity index 100% rename from static/tests/test-classic-landscape-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-ipad-mini-1--desc-count.txt rename to static/tests/test-classic-landscape-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-ipad-mini-1--desc-count--id-list-of-words-container.txt diff --git a/static/tests/test-classic-landscape-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-ipad-mini-1--desc-n-words-ngram.txt b/static/tests/test-classic-landscape-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-ipad-mini-1--desc-n-words-ngram--id-list-of-words-container.txt similarity index 100% rename from static/tests/test-classic-landscape-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-ipad-mini-1--desc-n-words-ngram.txt rename to static/tests/test-classic-landscape-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-ipad-mini-1--desc-n-words-ngram--id-list-of-words-container.txt diff --git a/static/tests/test-classic-landscape-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-ipad-mini-1--desc-word-prefix.txt b/static/tests/test-classic-landscape-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-ipad-mini-1--desc-word-prefix--id-list-of-words-container.txt similarity index 100% rename from static/tests/test-classic-landscape-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-ipad-mini-1--desc-word-prefix.txt rename to static/tests/test-classic-landscape-ipad-mini-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-ipad-mini-1--desc-word-prefix--id-list-of-words-container.txt diff --git a/static/tests/test-classic-landscape-ipad-mini-3-lite.koboldai.net.spec.ts b/static/tests/test-classic-landscape-ipad-mini-3-lite.koboldai.net.spec.ts index 5323ece312930671278ecd7ce247d56127dd003f..17e3c6caf498e4686feadcb38c3ca5ee96149d33 100644 --- a/static/tests/test-classic-landscape-ipad-mini-3-lite.koboldai.net.spec.ts +++ b/static/tests/test-classic-landscape-ipad-mini-3-lite.koboldai.net.spec.ts @@ -13,7 +13,7 @@ * 8. Verifying ARIA/accessibility and content. */ import { test, expect, Page } from '@playwright/test'; -import { assertCellAndLink, expectOnlyVisibleTextInElement } from './test-helper' +import { expectOnlyVisibleTextInElement, uploadFileWithPageAndFilepath } from './test-helper' const testStoryJsonTxt = `${import.meta.dirname}/../../tests/events/very_long_text.json` @@ -30,15 +30,7 @@ test('test My Ghost Writer, ipad mini landscape: try using My Ghost Writer with await page.getByRole('button', { name: 'Set UI' }).click(); // 3. Upload a saved JSON story file to provide long text content for analysis - console.log(`preparing uploading of file '${testStoryJsonTxt}'!`) - await page.getByRole('link', { name: 'Save / Load' }).click(); - await page.waitForTimeout(100) - const fileChooserPromise = page.waitForEvent('filechooser'); - await page.getByRole('button', { name: '📁 Open File' }).click(); - const fileChooser = await fileChooserPromise; - await fileChooser.setFiles(testStoryJsonTxt); - await page.waitForTimeout(300) - console.log(`file '${testStoryJsonTxt}' uploaded!`) + await uploadFileWithPageAndFilepath(page, testStoryJsonTxt) // 4. Open settings and enable the "My Ghost Writer" text stats feature await page.getByRole('link', { name: 'Settings' }).click(); diff --git a/static/tests/test-classic-landscape-mobile-iphone13-0-lite.koboldai.net.spec.ts b/static/tests/test-classic-landscape-mobile-iphone13-0-lite.koboldai.net.spec.ts index a5d2a9e4ad94f69de2d2b4b43a6271e90f8adcb7..8482485738c2c40817f6d085b62d3346d385c166 100644 --- a/static/tests/test-classic-landscape-mobile-iphone13-0-lite.koboldai.net.spec.ts +++ b/static/tests/test-classic-landscape-mobile-iphone13-0-lite.koboldai.net.spec.ts @@ -1,25 +1,25 @@ -import { test, expect, devices } from '@playwright/test'; -import { fileReader } from './test-helper'; +import { test, expect } from '@playwright/test'; +import { expectOnlyVisibleTextInElement, scrollToBottomById, uploadFileWithPageAndFilepath } from './test-helper'; -const testStoryTxt = `${import.meta.dirname}/../../tests/events/very_long_text.txt`; +const testStoryJsonTxt = `${import.meta.dirname}/../../tests/events/very_long_text.json`; +const expectedTextArray = [ + `Mr. and Mrs. Dursley, of number four, Privet Drive, were proud to say that they were perfectly normal, thank you very much. They were the last people you'd expect to be involved in anything strange or mysterious, because they just didn't hold with such nonsense.`, + `He took off his thick black coat and threw it to Harry.\"You can kip under that,\" he said. \"Don' mind if it wriggles a bit, I think I still got a couple o' dormice in one o' the pockets.\"Harry woke early the next morning. Although he could` +] test('test My Ghost Writer, iPhone 13 landscape: stemming/duplicates', async ({ page }) => { await page.goto('http://localhost:8000/'); await page.getByRole('button', { name: 'Set UI' }).click(); - await page.getByRole('checkbox', { name: 'Allow Editing' }).check(); - const text = await fileReader(testStoryTxt); - let gameEditor = page.locator('#gametext'); - await gameEditor.click(); - await gameEditor.fill(text); - await expect(gameEditor).toContainText(text.slice(0, 50), { timeout: 15000 }); - await page.waitForTimeout(100); - + await page.getByRole('button', { name: 'id-mobile-main-menu-options' }).click(); + await uploadFileWithPageAndFilepath(page, testStoryJsonTxt) + // Activate text stats feature - await page.getByRole('button', { name: 'Main Menu Options' }).click(); + await page.getByRole('button', { name: 'id-mobile-main-menu-options' }).click(); await page.getByRole('link', { name: 'Settings' }).click(); await page.getByRole('link', { name: 'Tokens' }).click(); await page.getByRole('button', { name: 'id-expand-wordsfreqstats' }).click(); await page.getByRole('checkbox', { name: 'id-col2-words-frequency-enable' }).check(); + await expect(page.getByRole('checkbox', { name: 'id-col2-words-frequency-enable' })).toBeChecked(); await page.getByRole('button', { name: 'OK' }).click(); await page.waitForTimeout(100); @@ -28,10 +28,100 @@ test('test My Ghost Writer, iPhone 13 landscape: stemming/duplicates', async ({ // Interact with filter for stemming/duplicates scenario await page.getByRole('searchbox', { name: 'filter-words-frequency' }).click(); - await page.getByRole('searchbox', { name: 'filter-words-frequency' }).fill('the'); + await page.getByRole('searchbox', { name: 'filter-words-frequency' }).fill('th'); await page.getByRole('searchbox', { name: 'filter-words-frequency' }).press('Enter'); await page.waitForTimeout(100); - await expect(page.getByLabel('id-filtered-value')).toContainText('the:'); - // Add more assertions as needed for stemming/duplicates scenario + await expect(page.getByLabel('id-filtered-value')).toContainText('th:'); + + + // 5. Open the mobile menu and interact with the floating dropdown menu content for text stats + await page.getByRole("button", { name: "id-navtoggler-words-freq" }).click(); // Open mobile floating menu + await page.getByRole("searchbox", { name: "filter-words-frequency" }).click(); // Focus filter input in floating menu + await page + .getByRole("searchbox", { name: "filter-words-frequency" }) + .fill("th"); // Filter for 'th' + await page + .getByRole("searchbox", { name: "filter-words-frequency" }) + .press("Enter"); // Apply filter + // First set of assertions + // await page.getByLabel('id-current-table-of-words-btn').click(); + await expect(page.getByLabel("id-list-of-words-1-nth")).toContainText( + "that: 157" + ); + await page.getByLabel("id-list-of-words-1-nth").click(); + await expect(page.getByLabel("id-table-1-row-0-nth-link")).toContainText( + "to say that they" + ); + await page.getByLabel("id-table-1-row-0-nth-link").click(); + // visual snapshot + await expectOnlyVisibleTextInElement(page, "gametext", expectedTextArray[0]); + + await expect(page.getByLabel("id-current-table-of-words-btn")).toBeVisible(); + await page.getByLabel("id-current-table-of-words-btn").click(); + await expect(page.getByLabel("id-filtered-value")).toContainText("th: 1701"); + + // First set of assertions + await expect(page.getByLabel("id-list-of-words-0-nth")).toContainText( + "the: 734 " + ); + await page.getByLabel("id-list-of-words-0-nth").click(); + await expect(page.getByLabel("id-table-0-row-0-nth-link")).toContainText( + "THE BOY WHO" + ); + + await scrollToBottomById(page, "id-current-table-of-words-scrollable"); + + await expect(page.getByLabel("id-table-0-row-733-nth-link")).toBeVisible(); + await expect(page.getByLabel("id-table-0-row-733-nth-link")).toContainText( + "early the next" + ); + await page.waitForTimeout(100); + + // 6. Interact with the text stats UI: sort and verify word frequency tables (still within floating menu) + await page.getByRole("button", { name: "id-navtoggler-words-freq" }).click(); // Reopen floating menu if needed + await page.getByLabel("id-select-order-by").selectOption("asc"); // Change sort order + await page.getByRole("searchbox", { name: "filter-words-frequency" }).click(); + await page + .getByRole("searchbox", { name: "filter-words-frequency" }) + .press("Enter"); // Re-apply filter + await page.waitForTimeout(100); + + // Second set of assertions + await expect(page.getByLabel("id-list-of-words-0-nth")).toContainText( + "anything strange: 1" + ); + await expect(page.getByLabel("id-list-of-words-1700-nth")).toContainText( + "the: 734" + ); + + await page.getByLabel("id-list-of-words-1700-nth").click(); // Open word frequency table + await expect(page.getByLabel("id-table-1700-row-0-nth-link")).toContainText( + "THE BOY WHO" + ); + + await scrollToBottomById(page, "id-current-table-of-words-scrollable"); + const lastTableElement = page.getByLabel("id-table-1700-row-733-nth-link") + await lastTableElement.click() + await expect(lastTableElement).toBeVisible(); + await expect(lastTableElement).toContainText( + "early the next" + ); + await page.waitForTimeout(100); + + // Edit mode, asserting that there is a single child node containing some short sentences + await expectOnlyVisibleTextInElement(page, "gametext", expectedTextArray[1]); + + // 7. Assert correct UI updates and ARIA snapshots for accessibility + // Deactivate edit mode + await page.getByRole("checkbox", { name: "Allow Editing" }).uncheck(); + await page.waitForTimeout(200); + + await expect(page.getByLabel('id-current-table-of-words-btn')).toBeVisible(); + await page.getByLabel('id-current-table-of-words-btn').click(); + await scrollToBottomById(page, "id-list-of-words-scrollable"); + await expect(page.getByLabel("id-list-of-words-1699-nth")).toMatchAriaSnapshot( + `- text: "that: 157 reps."` + ); + page.close(); }); diff --git a/static/tests/test-classic-landscape-mobile-iphone13-1-lite.koboldai.net.spec.ts b/static/tests/test-classic-landscape-mobile-iphone13-1-lite.koboldai.net.spec.ts index fa4075e727dc966cf8661695c7280d6c5844cfbd..518e2908b1748a680c646fa22fc81ecbf0b037c8 100644 --- a/static/tests/test-classic-landscape-mobile-iphone13-1-lite.koboldai.net.spec.ts +++ b/static/tests/test-classic-landscape-mobile-iphone13-1-lite.koboldai.net.spec.ts @@ -1,7 +1,7 @@ import { test, expect, devices } from '@playwright/test'; -import { fileReader } from './test-helper'; +import { uploadFileWithPageAndFilepath } from './test-helper'; -const testStoryJsonTxt = `${import.meta.dirname}/../../tests/events/very_long_text.txt`; +const testStoryJsonTxt = `${import.meta.dirname}/../../tests/events/very_long_text.json`; const orderSelectionValues = ["asc", "desc"]; const sortSelectionValues = ["word_prefix", "n_words_ngram", "count"]; @@ -13,16 +13,11 @@ test.use({ ...iphone13Landscape }); test('test My Ghost Writer, iPhone 13 landscape: order/sort', async ({ page }) => { await page.goto('http://localhost:8000/'); await page.getByRole('button', { name: 'Set UI' }).click(); - await page.getByRole('checkbox', { name: 'Allow Editing' }).click(); - const text = await fileReader(testStoryJsonTxt); - let gameEditor = page.locator('#gametext'); - await gameEditor.click(); - await gameEditor.fill(text); - await expect(gameEditor).toContainText(text.slice(0, 50), { timeout: 15000 }); - await page.waitForTimeout(100); - + await page.getByRole('button', { name: 'id-mobile-main-menu-options' }).click(); + await uploadFileWithPageAndFilepath(page, testStoryJsonTxt) + // Activate text stats feature - await page.getByRole('button', { name: 'Main Menu Options' }).click(); + await page.getByRole('button', { name: 'id-mobile-main-menu-options' }).click(); await page.getByRole('link', { name: 'Settings' }).click(); await page.getByRole('link', { name: 'Tokens' }).click(); await page.getByRole('button', { name: 'id-expand-wordsfreqstats' }).click(); @@ -49,7 +44,7 @@ test('test My Ghost Writer, iPhone 13 landscape: order/sort', async ({ page }) = await page.getByRole('searchbox', { name: 'filter-words-frequency' }).fill('th'); await page.getByRole('searchbox', { name: 'filter-words-frequency' }).press('Enter'); await page.waitForTimeout(300); - await expect(page.getByLabel('id-list-of-words-container')).toMatchAriaSnapshot({ name: `test-classic-landscape-iphone13-1--${currentOrderSelectionValue}-${currentSortSelectionValue}.txt` }); + await expect(page.getByLabel('id-list-of-words-container')).toMatchAriaSnapshot({ name: `test-classic-landscape-iphone13-1--${currentOrderSelectionValue}-${currentSortSelectionValue}--id-list-of-words-container.txt` }); } } page.close(); diff --git a/static/tests/test-classic-landscape-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-iphone13-1--asc-count.txt b/static/tests/test-classic-landscape-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-iphone13-1--asc-count--id-list-of-words-container.txt similarity index 100% rename from static/tests/test-classic-landscape-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-iphone13-1--asc-count.txt rename to static/tests/test-classic-landscape-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-iphone13-1--asc-count--id-list-of-words-container.txt diff --git a/static/tests/test-classic-landscape-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-iphone13-1--asc-n-words-ngram.txt b/static/tests/test-classic-landscape-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-iphone13-1--asc-n-words-ngram--id-list-of-words-container.txt similarity index 100% rename from static/tests/test-classic-landscape-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-iphone13-1--asc-n-words-ngram.txt rename to static/tests/test-classic-landscape-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-iphone13-1--asc-n-words-ngram--id-list-of-words-container.txt diff --git a/static/tests/test-classic-landscape-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-iphone13-1--asc-word-prefix.txt b/static/tests/test-classic-landscape-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-iphone13-1--asc-word-prefix--id-list-of-words-container.txt similarity index 100% rename from static/tests/test-classic-landscape-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-iphone13-1--asc-word-prefix.txt rename to static/tests/test-classic-landscape-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-iphone13-1--asc-word-prefix--id-list-of-words-container.txt diff --git a/static/tests/test-classic-landscape-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-iphone13-1--desc-count.txt b/static/tests/test-classic-landscape-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-iphone13-1--desc-count--id-list-of-words-container.txt similarity index 100% rename from static/tests/test-classic-landscape-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-iphone13-1--desc-count.txt rename to static/tests/test-classic-landscape-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-iphone13-1--desc-count--id-list-of-words-container.txt diff --git a/static/tests/test-classic-landscape-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-iphone13-1--desc-n-words-ngram.txt b/static/tests/test-classic-landscape-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-iphone13-1--desc-n-words-ngram--id-list-of-words-container.txt similarity index 100% rename from static/tests/test-classic-landscape-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-iphone13-1--desc-n-words-ngram.txt rename to static/tests/test-classic-landscape-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-iphone13-1--desc-n-words-ngram--id-list-of-words-container.txt diff --git a/static/tests/test-classic-landscape-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-iphone13-1--desc-word-prefix.txt b/static/tests/test-classic-landscape-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-iphone13-1--desc-word-prefix--id-list-of-words-container.txt similarity index 100% rename from static/tests/test-classic-landscape-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-iphone13-1--desc-word-prefix.txt rename to static/tests/test-classic-landscape-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-landscape-iphone13-1--desc-word-prefix--id-list-of-words-container.txt diff --git a/static/tests/test-classic-landscape-mobile-iphone13-3-lite.koboldai.net.spec.ts b/static/tests/test-classic-landscape-mobile-iphone13-3-lite.koboldai.net.spec.ts index 39f083ab5584ab109842a798d99769f9a6c73cb6..9c5d0775283c0c8f6e83d34cee487fe84811304c 100644 --- a/static/tests/test-classic-landscape-mobile-iphone13-3-lite.koboldai.net.spec.ts +++ b/static/tests/test-classic-landscape-mobile-iphone13-3-lite.koboldai.net.spec.ts @@ -1,12 +1,9 @@ import { test, expect, devices } from '@playwright/test'; -import { expectOnlyVisibleTextInElement, fileReader } from './test-helper'; +import { expectOnlyVisibleTextInElement, fileReader, uploadFileWithPageAndFilepath } from './test-helper'; -const testStoryJsonTxt = `${import.meta.dirname}/../../tests/events/very_long_text.txt`; +const testStoryJsonTxt = `${import.meta.dirname}/../../tests/events/very_long_text.json`; const expectedTextArray = [ - `"It's gettin' late and we've got lots ter do tomorrow," said Hagrid loudly. "Gotta get up ter town, get all yer books an' that." -He took off his thick black coat and threw it to Harry. -"You can kip under that," he said. "Don' mind if it wriggles a bit, I think I still got a couple o' dormice in one o' the pockets." -Harry woke early the next morning. Although he could` + `He took off his thick black coat and threw it to Harry."You can kip under that," he said. "Don' mind if it wriggles a bit, I think I still got a couple o' dormice in one o' the pockets."Harry woke early the next morning. Although he could` ]; const iphone13Landscape = devices['iPhone 13 landscape']; @@ -19,22 +16,24 @@ test('My Ghost Writer, iPhone 13 landscape: Aesthetic UI to Corpo UI and Raw Edi await page.getByRole('button', { name: 'Set UI' }).click(); await page.getByRole('button', { name: 'Toggle Action Menu' }).click(); await page.getByRole('button', { name: 'Edit' }).click(); - let gameEditor = page.locator('#gametext'); - await gameEditor.click(); - await gameEditor.fill(text); - await expect(gameEditor).toContainText(text.slice(0, 50), { timeout: 15000 }); - await page.waitForTimeout(100); + + await page.getByRole('button', { name: 'id-mobile-main-menu-options' }).click(); + await uploadFileWithPageAndFilepath(page, testStoryJsonTxt) + await expectOnlyVisibleTextInElement(page, 'gametext', expectedTextArray[0]); await page.waitForTimeout(100); - await page.getByRole('button', { name: 'Main Menu Options' }).click(); + + await page.getByRole('button', { name: 'id-mobile-main-menu-options' }).click(); await page.getByRole('link', { name: 'Settings' }).click(); await page.getByRole('link', { name: 'Tokens' }).click(); await page.getByRole('button', { name: 'id-expand-wordsfreqstats' }).click(); await page.getByRole('checkbox', { name: 'id-col2-words-frequency-enable' }).check(); + await expect(page.getByRole('checkbox', { name: 'id-col2-words-frequency-enable' })).toBeChecked(); await page.getByRole('button', { name: 'OK' }).click(); - await expect(page.getByRole('button', { name: 'Edit' })).toBeVisible(); - await expect(page.locator('#btn_editmode')).toContainText('Edit'); - await page.getByRole('button', { name: 'Edit' }).click(); + + await expect(page.getByRole('checkbox', { name: 'Allow Editing' })).toBeVisible(); + await page.getByRole('checkbox', { name: 'Allow Editing' }).check(); + await expect(page.getByLabel('id-words-frequency-description')).toBeVisible(); await expect(page.getByLabel('id-words-frequency-description')).toContainText('My Ghost Writer will analyze your text and report in this section some statistics and a list of words grouped into stems.'); await page.waitForTimeout(100); diff --git a/static/tests/test-classic-mobile-iphone13-0-lite.koboldai.net.spec.ts b/static/tests/test-classic-mobile-iphone13-0-lite.koboldai.net.spec.ts index acf910257e41a10f66b482d4e358d3cf013bac65..90b52c22130738bc2d3989f4f025a574df980a4f 100644 --- a/static/tests/test-classic-mobile-iphone13-0-lite.koboldai.net.spec.ts +++ b/static/tests/test-classic-mobile-iphone13-0-lite.koboldai.net.spec.ts @@ -11,7 +11,7 @@ * 7. Assert correct UI updates and ARIA snapshots for accessibility. */ import { test, expect, devices, Page } from "@playwright/test"; -import { expectOnlyVisibleTextInElement, fileReader, scrollToBottomById } from "./test-helper"; +import { expectOnlyVisibleTextInElement, scrollToBottomById, uploadFileWithPageAndFilepath } from "./test-helper"; export function scrollToBottom(idElement: string) { const element = document.getElementById(idElement); @@ -24,7 +24,7 @@ export function scrollToBottom(idElement: string) { } } -const testStoryTxt = `${import.meta.dirname}/../../tests/events/very_long_text.txt`; +const testStoryJsonTxt = `${import.meta.dirname}/../../tests/events/very_long_text.json` /* test.use({ ...devices['iPhone 13'], @@ -49,7 +49,6 @@ Harry woke early the next morning. Although he could`, test("test My Ghost Writer, iphone 13: navigate between the list/tables containing the stemming and the duplicated words", async ({ page }: { page: Page }) => { // 1. Connect to the local web server page - const text = await fileReader(testStoryTxt); await page.goto("http://localhost:8000/"); await expect(page.locator("#welcomecontainer")).toContainText("Set UI"); @@ -57,17 +56,13 @@ test("test My Ghost Writer, iphone 13: navigate between the list/tables containi await page.getByRole("button", { name: "Set UI" }).click(); // 3. Enable editing and fill the editor with long text content - await page.getByRole("checkbox", { name: "Allow Editing" }).check(); - let gameEditor = page.locator("#gametext"); - await gameEditor.click(); - await gameEditor.fill(text); - await expect(gameEditor).toContainText(text.slice(0, 50), { timeout: 15000 }); - await page.waitForTimeout(100); - await expectOnlyVisibleTextInElement(page, "gametext", expectedTextArray[0]); - await page.waitForTimeout(100); + await page.getByRole("checkbox", { name: "Allow Editing" }).click(); // 4. Activate "My Ghost Writer" / text stats functionality via settings - await page.getByRole("button", { name: "Main Menu Options" }).click(); + await page.getByRole('button', { name: 'id-mobile-main-menu-options' }).click(); + await uploadFileWithPageAndFilepath(page, testStoryJsonTxt) + + await page.getByRole('button', { name: 'id-mobile-main-menu-options' }).click(); await page.getByRole("link", { name: "Settings" }).click(); await page.getByRole("link", { name: "Tokens" }).click(); await page.getByRole("button", { name: "id-expand-wordsfreqstats" }).click(); @@ -159,6 +154,10 @@ test("test My Ghost Writer, iphone 13: navigate between the list/tables containi await page.getByRole("checkbox", { name: "Allow Editing" }).uncheck(); await page.waitForTimeout(100); + await expect(page.getByLabel('id-current-table-of-words-btn')).toBeVisible(); + await page.getByLabel('id-current-table-of-words-btn').click(); + await scrollToBottomById(page, "id-current-table-of-words-scrollable"); + await expect(page.getByLabel("id-list-of-words-1699-nth")).toMatchAriaSnapshot( `- text: "that: 157 reps."` ); diff --git a/static/tests/test-classic-mobile-iphone13-0-lite.koboldai.net.spec.ts-snapshots/test-1-MobileSafari-darwin.png b/static/tests/test-classic-mobile-iphone13-0-lite.koboldai.net.spec.ts-snapshots/test-1-MobileSafari-darwin.png deleted file mode 100644 index 12b4d34afa5440f945e5c79745f4303a17e893de..0000000000000000000000000000000000000000 --- a/static/tests/test-classic-mobile-iphone13-0-lite.koboldai.net.spec.ts-snapshots/test-1-MobileSafari-darwin.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b6a609f8a32fc8c55672d1c64ab842606d67c5725e2b011da8bace1e82568af1 -size 48156 diff --git a/static/tests/test-classic-mobile-iphone13-1-lite.koboldai.net.spec.ts b/static/tests/test-classic-mobile-iphone13-1-lite.koboldai.net.spec.ts index 9007d840137984aa2e7388d0712e6681610a4ec0..a5878a33fd94bcfdef57d93681f6c1d8e902e5fb 100644 --- a/static/tests/test-classic-mobile-iphone13-1-lite.koboldai.net.spec.ts +++ b/static/tests/test-classic-mobile-iphone13-1-lite.koboldai.net.spec.ts @@ -11,9 +11,9 @@ * 7. Assert correct UI updates and ARIA snapshots for accessibility. */ import { test, expect } from '@playwright/test'; -import { fileReader, expectOnlyVisibleTextInElement } from './test-helper'; +import { uploadFileWithPageAndFilepath } from './test-helper'; -const testStoryJsonTxt = `${import.meta.dirname}/../../tests/events/very_long_text.txt`; +const testStoryJsonTxt = `${import.meta.dirname}/../../tests/events/very_long_text.json`; const orderSelectionValues = ["asc", "desc"]; const sortSelectionValues = ["word_prefix", "n_words_ngram", "count"]; const expectedTextArray = [ @@ -45,22 +45,15 @@ test('test My Ghost Writer, iphone 13: order/sort', async ({ page }) => { // 3. Enable editing and fill the editor with long text content await page.getByRole('checkbox', { name: 'Allow Editing' }).check(); // Use the JSON file for consistency with desktop test - const text = await fileReader(testStoryJsonTxt); - let gameEditor = page.locator('#gametext'); - await gameEditor.click(); - await gameEditor.fill(text); - await expect(gameEditor).toContainText(text.slice(0, 50), { timeout: 15000 }); - await page.waitForTimeout(100); - // Optionally assert visible text if needed - await expectOnlyVisibleTextInElement(page, "gametext", expectedTextArray[0]); - await page.waitForTimeout(100); + await page.getByRole('button', { name: 'id-mobile-main-menu-options' }).click(); + await uploadFileWithPageAndFilepath(page, testStoryJsonTxt) // 4. Activate "My Ghost Writer" / text stats functionality via settings - await page.getByRole('button', { name: 'Main Menu Options' }).click(); + await page.getByRole('button', { name: 'id-mobile-main-menu-options' }).click(); await page.getByRole('link', { name: 'Settings' }).click(); await page.getByRole('link', { name: 'Tokens' }).click(); await page.getByRole('button', { name: 'id-expand-wordsfreqstats' }).click(); - await page.getByRole('checkbox', { name: 'id-col2-words-frequency-enable' }).check(); + await page.getByRole('checkbox', { name: 'id-col2-words-frequency-enable' }).click(); await expect(page.getByRole('checkbox', { name: 'id-col2-words-frequency-enable' })).toBeChecked(); await page.getByRole('button', { name: 'OK' }).click(); await page.waitForTimeout(100); @@ -99,7 +92,7 @@ test('test My Ghost Writer, iphone 13: order/sort', async ({ page }) => { await page.getByRole('searchbox', { name: 'filter-words-frequency' }).press('Enter'); await page.waitForTimeout(300); // Assert that the list of words container matches the expected ARIA snapshot for this combination - await expect(page.getByLabel('id-list-of-words-container')).toMatchAriaSnapshot({ name: `test-classic-mobile-iphone13-1--${currentOrderSelectionValue}-${currentSortSelectionValue}.txt` }); + await expect(page.getByLabel('id-list-of-words-container')).toMatchAriaSnapshot({ name: `test-classic-mobile-iphone13-1--${currentOrderSelectionValue}-${currentSortSelectionValue}--id-list-of-words-container.txt` }); } } // End of test diff --git a/static/tests/test-classic-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-mobile-iphone13-1--asc-count.txt b/static/tests/test-classic-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-mobile-iphone13-1--asc-count--id-list-of-words-container.txt similarity index 100% rename from static/tests/test-classic-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-mobile-iphone13-1--asc-count.txt rename to static/tests/test-classic-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-mobile-iphone13-1--asc-count--id-list-of-words-container.txt diff --git a/static/tests/test-classic-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-mobile-iphone13-1--asc-n-words-ngram.txt b/static/tests/test-classic-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-mobile-iphone13-1--asc-n-words-ngram--id-list-of-words-container.txt similarity index 100% rename from static/tests/test-classic-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-mobile-iphone13-1--asc-n-words-ngram.txt rename to static/tests/test-classic-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-mobile-iphone13-1--asc-n-words-ngram--id-list-of-words-container.txt diff --git a/static/tests/test-classic-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-mobile-iphone13-1--asc-word-prefix.txt b/static/tests/test-classic-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-mobile-iphone13-1--asc-word-prefix--id-list-of-words-container.txt similarity index 100% rename from static/tests/test-classic-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-mobile-iphone13-1--asc-word-prefix.txt rename to static/tests/test-classic-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-mobile-iphone13-1--asc-word-prefix--id-list-of-words-container.txt diff --git a/static/tests/test-classic-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-mobile-iphone13-1--desc-count.txt b/static/tests/test-classic-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-mobile-iphone13-1--desc-count--id-list-of-words-container.txt similarity index 100% rename from static/tests/test-classic-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-mobile-iphone13-1--desc-count.txt rename to static/tests/test-classic-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-mobile-iphone13-1--desc-count--id-list-of-words-container.txt diff --git a/static/tests/test-classic-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-mobile-iphone13-1--desc-n-words-ngram.txt b/static/tests/test-classic-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-mobile-iphone13-1--desc-n-words-ngram--id-list-of-words-container.txt similarity index 100% rename from static/tests/test-classic-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-mobile-iphone13-1--desc-n-words-ngram.txt rename to static/tests/test-classic-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-mobile-iphone13-1--desc-n-words-ngram--id-list-of-words-container.txt diff --git a/static/tests/test-classic-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-mobile-iphone13-1--desc-word-prefix.txt b/static/tests/test-classic-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-mobile-iphone13-1--desc-word-prefix--id-list-of-words-container.txt similarity index 100% rename from static/tests/test-classic-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-mobile-iphone13-1--desc-word-prefix.txt rename to static/tests/test-classic-mobile-iphone13-1-lite.koboldai.net.spec.ts-snapshots/test-classic-mobile-iphone13-1--desc-word-prefix--id-list-of-words-container.txt diff --git a/static/tests/test-classic-mobile-iphone13-3-lite.koboldai.net.spec.ts b/static/tests/test-classic-mobile-iphone13-3-lite.koboldai.net.spec.ts index c562312773d925ede5cba719599139f3b221b831..7a097fbce0bdd89fe960428abecdc37c53b7362a 100644 --- a/static/tests/test-classic-mobile-iphone13-3-lite.koboldai.net.spec.ts +++ b/static/tests/test-classic-mobile-iphone13-3-lite.koboldai.net.spec.ts @@ -14,9 +14,9 @@ * 8. Verifying ARIA/accessibility and content. */ import { test, expect } from '@playwright/test'; -import { expectOnlyVisibleTextInElement, fileReader } from './test-helper' +import { expectOnlyVisibleTextInElement, fileReader, uploadFileWithPageAndFilepath } from './test-helper' -const testStoryTxt = `${import.meta.dirname}/../../tests/events/very_long_text.txt`; +const testStoryJsonTxt = `${import.meta.dirname}/../../tests/events/very_long_text.json`; const expectedTextArray = [ `"Why aren't you supposed to do magic?" asked Harry.\n"Oh, well — I was at Hogwarts meself but I — er — got expelled, ter tell yeh the truth. In me third year. They snapped me wand in half an' everything. But Dumbledore let me stay on as gamekeeper. Great man, Dumbledore." @@ -31,7 +31,6 @@ Harry woke early the next morning. Although he could`, ] test('My Ghost Writer, iPhone 13: Aesthetic UI to Corpo UI and Raw Editor', async ({ page }) => { - const text = await fileReader(testStoryTxt); // 1. Connect to the local web server page await page.goto('http://localhost:8000/'); @@ -43,16 +42,11 @@ test('My Ghost Writer, iPhone 13: Aesthetic UI to Corpo UI and Raw Editor', asyn await page.getByRole('button', { name: 'Toggle Action Menu' }).click(); await page.getByRole('button', { name: 'Edit' }).click(); - let gameEditor = page.locator("#gametext"); - await gameEditor.click(); - await gameEditor.fill(text); - await expect(gameEditor).toContainText(text.slice(0, 50), { timeout: 15000 }); - await page.waitForTimeout(100); - await expectOnlyVisibleTextInElement(page, "gametext", expectedTextArray[0]); - await page.waitForTimeout(100); + await page.getByRole('button', { name: 'id-mobile-main-menu-options' }).click(); + await uploadFileWithPageAndFilepath(page, testStoryJsonTxt) // 4. Activate "My Ghost Writer" / text stats functionality via settings - await page.getByRole("button", { name: "Main Menu Options" }).click(); + await page.getByRole('button', { name: 'id-mobile-main-menu-options' }).click(); await page.getByRole("link", { name: "Settings" }).click(); // 4. Open settings and enable the "My Ghost Writer" text stats feature @@ -61,9 +55,8 @@ test('My Ghost Writer, iPhone 13: Aesthetic UI to Corpo UI and Raw Editor', asyn await page.getByRole('checkbox', { name: 'id-col2-words-frequency-enable' }).check(); await page.getByRole('button', { name: 'OK' }).click(); - await expect(page.getByRole('button', { name: 'Edit' })).toBeVisible(); - await expect(page.locator('#btn_editmode')).toContainText('Edit'); - await page.getByRole('button', { name: 'Edit' }).click(); + await expect(page.getByRole('checkbox', { name: 'Allow Editing' })).toBeVisible(); + await page.getByRole('checkbox', { name: 'Allow Editing' }).check(); // 5. Assert that the description for the text stats feature is visible and correct await expect(page.getByLabel('id-words-frequency-description')).toBeVisible(); await expect(page.getByLabel('id-words-frequency-description')).toContainText('My Ghost Writer will analyze your text and report in this section some statistics and a list of words grouped into stems.'); @@ -80,7 +73,7 @@ test('My Ghost Writer, iPhone 13: Aesthetic UI to Corpo UI and Raw Editor', asyn await expect(page.locator('list')).toContainText('the: 734'); // 7. Switch to Corpo UI via settings and open the Raw Editor - await page.getByRole('button', { name: 'Main Menu Options' }).click(); + await page.getByRole('button', { name: 'id-mobile-main-menu-options' }).click(); await page.getByRole('link', { name: 'Settings' }).click(); await page.getByRole('link', { name: 'Format' }).click(); await page.locator('#gui_type').selectOption('3'); @@ -97,7 +90,7 @@ test('My Ghost Writer, iPhone 13: Aesthetic UI to Corpo UI and Raw Editor', asyn await expect(page.getByLabel('id-list-of-words-0-nth')).toContainText('the: 734'); // 8. Re-open settings and re-apply Corpo UI to ensure persistence - await page.getByRole("button", { name: "Main Menu Options" }).click(); + await page.getByRole('button', { name: 'id-mobile-main-menu-options' }).click(); await page.getByRole('link', { name: 'Settings' }).click(); await page.getByRole('link', { name: 'Tokens' }).click(); await page.getByRole('link', { name: 'Format' }).click(); diff --git a/static/tests/test-classic-responsive-1270x550-lite.koboldai.net.spec.ts b/static/tests/test-classic-responsive-1270x550-lite.koboldai.net.spec.ts index baea9b55cbc7a260d718e51b97f3ca1e147af0e8..9f21aeb627a1df528b16583b9bbcd17d1d8c9d52 100644 --- a/static/tests/test-classic-responsive-1270x550-lite.koboldai.net.spec.ts +++ b/static/tests/test-classic-responsive-1270x550-lite.koboldai.net.spec.ts @@ -1,8 +1,14 @@ // Playwright E2E test for My Ghost Writer "Text Stats" feature on high/narrow window (550x550) import { test, expect } from '@playwright/test'; -import { assertCellAndLink, fileReader } from './test-helper' +import { assertCellAndLinkAriaSnapshot, uploadFileWithPageAndFilepath } from './test-helper' -const testStoryTxt = `${import.meta.dirname}/../../tests/events/very_long_text.txt` +const testStoryJsonTxt = `${import.meta.dirname}/../../tests/events/very_long_text.json` +const expectedStringArray = [ + "THE BOY WHO LIVEDMr. and Mrs. Dursley, of number four, Privet Drive, were proud to say that they were perfectly normal, thank you very much. They were the last people you'd expect to be involved in anything strange or mysterious, because they just didn't hold with such nonsense.Mr. Dursley was the director of a firm called Grunnings, which made drills. He was a big, beefy man with hardly any neck, although he did have a very large mustache. Mrs. Dursley was thin and blonde and had nearly twice the usual amount of neck, which came in very useful as she spent so much of her time craning over garden fences, spying on the neighbors. The Dursley s had a small son called Dudley and in their opinion there was no finer boy anywhere.The Dursleys had everything they wanted, but they also had a secret, and their greatest fear was that somebody would discover it. They didn't think they could bear it if anyone found out about the Potters. Mrs. Potter was Mrs. Dursley's sister, but they hadn'tmet for several years; in fact, Mrs. Dursley pretended she didn't have a sister, because her sister and her good-for-nothing husband were as unDursleyish as it was possible to be. The Dursleys shuddered to think what the neighbors would say if the Potters arrived in the street. The Dursleys knew that the Potters had a small son, too, but they had never even seen him.This boy was another good reason for keeping the Potters away; they didn't want Dudley mixing with a child like that.When Mr. and Mrs. Dursley woke up on the dull, gray Tuesday our story starts, there was nothing about the cloudy sky outside to suggest that strange and mysterious things would soon be happening all over the country. Mr. Dursley hummed as he picked out his most boring tie for work, and Mrs. Dursley gossiped away happily as she wrestled a screaming Dudley into his high chair.", + "the next second, Dudley was dancing on the spot with his hands clasped over his fat bottom, howling in pain. When he turned his back on them, Harry saw a curly pig's tail poking through a hole in his trousers.Uncle Vernon roared. Pulling Aunt Petunia and Dudley into the other room, he cast one last terrified look at Hagrid and slammed the door behind them.Hagrid looked down at his umbrella and stroked his beard.\"Shouldn'ta lost me temper,\" he said ruefully, \"but it didn't work anyway. Meant ter turn him into a pig, but I suppose he was so much like a pig anyway there wasn't much left ter do.\"He cast a sideways look at Harry under his bushy eyebrows.\"Be grateful if yeh didn't mention that ter anyone at Hogwarts,\" he said. \"I'm — er — not supposed ter do magic, strictly speakin'. I was allowed ter do a bit ter follow yeh an' get yer letters to yeh an' stuff — one o' the reasons I was so keen ter take on the job — \"\"Why aren't you supposed to do magic?\" asked Harry.\"Oh, well — I was at Hogwarts meself but I — er — got expelled, ter tell yeh the truth. In me third year. They snapped me wand in half an' everything. But Dumbledore let me stay on as gamekeeper. Great man, Dumbledore.\"\"Why were you expelled?\"\"It's gettin' late and we've got lots ter do tomorrow,\" said Hagrid loudly. \"Gotta get up ter town, get all yer books an' that.\"He took off his thick black coat and threw it to Harry.\"You can kip under that,\" he said. \"Don' mind if it wriggles a bit, I think I still got a couple o' dormice in one o' the pockets.\"Harry woke early the next morning. Although he could", + "Mr. and Mrs. Dursley, of number four, Privet Drive, were proud to say that they were perfectly normal, thank you very much. They were the last people you'd expect to be involved in anything strange or mysterious, because they just didn't hold with such nonsense.Mr. Dursley was the director of a firm called Grunnings, which made drills. He was a big, beefy man with hardly any neck, although he did have a very large mustache. Mrs. Dursley was thin and blonde and had nearly twice the usual amount of neck, which came in very useful as she spent so much of her time craning over garden fences, spying on the neighbors. The Dursley s had a small son called Dudley and in their opinion there was no finer boy anywhere.The Dursleys had everything they wanted, but they also had a secret, and their greatest fear was that somebody would discover it. They didn't think they could bear it if anyone found out about the Potters. Mrs. Potter was Mrs. Dursley's sister, but they hadn'tmet for several years; in fact, Mrs. Dursley pretended she didn't have a sister, because her sister and her good-for-nothing husband were as unDursleyish as it was possible to be. The Dursleys shuddered to think what the neighbors would say if the Potters arrived in the street. The Dursleys knew that the Potters had a small son, too, but they had never even seen him.This boy was another good reason for keeping the Potters away; they didn't want Dudley mixing with a child like that.When Mr. and Mrs. Dursley woke up on the dull, gray Tuesday our story starts, there was nothing about the cloudy sky outside to suggest that strange and mysterious things would soon be happening all over the country. Mr. Dursley hummed as he picked out his most boring tie for work, and Mrs. Dursley gossiped away happily as she wrestled a screaming Dudley into his high chair.", + "met for several years; in fact, Mrs. Dursley pretended she didn't have a sister, because her sister and her good-for-nothing husband were as unDursleyish as it was possible to be. The Dursleys shuddered to think what the neighbors would say if the Potters arrived in the street. The Dursleys knew that the Potters had a small son, too, but they had never even seen him.This boy was another good reason for keeping the Potters away; they didn't want Dudley mixing with a child like that.When Mr. and Mrs. Dursley woke up on the dull, gray Tuesday our story starts, there was nothing about the cloudy sky outside to suggest that strange and mysterious things would soon be happening all over the country. Mr. Dursley hummed as he picked out his most boring tie for work, and Mrs. Dursley gossiped away happily as she wrestled a screaming Dudley into his high chair.None of them noticed a large, tawny owl flutter past the window.At half past eight, Mr. Dursley picked up his briefcase, pecked Mrs. Dursley on the cheek, and tried to kiss Dudley good-bye but missed, because Dudley was now having a tantrum and throwing his cereal at the walls. \"Little tyke,\" chortled Mr. Dursley as he left the house. He got into his car and backed out of number four's drive.It was on the corner of the street that he noticed the first sign of something peculiar — a cat reading a map. For a second, Mr. Dursley didn't realize what he had seen — then he jerked his head around to look again. There was a tabby cat standing on the corner of Privet Drive, but there wasn't a map in sight. What could he have been thinking of? It must have been a trick of the light. Mr. Dursley blinked and stared atthe cat. It stared back. As Mr. Dursley drove around the corner and up the road, he watched the cat in his mirror. It was now reading the sign that said Privet Drive — no, looking at the sign; cats couldn't read maps or signs. Mr. Dursley gave himself a little shake and put the cat out of his mind. As he drove toward town he thought of nothing except a large order of drills he was hoping to get that day." +] test('test My Ghost Writer, high/narrow window (width 550 x height 1270): navigate between the value list/tables with mobile menu', async ({ page }) => { await page.setViewportSize({ width: 550, height: 1270 }); @@ -10,15 +16,10 @@ test('test My Ghost Writer, high/narrow window (width 550 x height 1270): naviga await page.getByRole('button', { name: 'Set UI' }).click(); // 3. Enable editing and fill the editor with long text content - await page.getByRole("checkbox", { name: "Allow Editing" }).check(); - const text = await fileReader(testStoryTxt); - let gameEditor = page.locator('#gametext'); - await gameEditor.click(); - await gameEditor.fill(text); - await expect(gameEditor).toContainText(text.slice(0, 50), { timeout: 15000 }); - await page.waitForTimeout(100); + await page.getByRole('button', { name: 'id-mobile-main-menu-options' }).click(); + await uploadFileWithPageAndFilepath(page, testStoryJsonTxt) - await page.getByRole('button', { name: 'Main Menu Options' }).click(); + await page.getByRole('button', { name: 'id-mobile-main-menu-options' }).click(); await page.getByRole('link', { name: 'Settings' }).click(); await page.getByRole('link', { name: 'Tokens' }).click(); await page.waitForTimeout(100) @@ -51,9 +52,9 @@ test('test My Ghost Writer, high/narrow window (width 550 x height 1270): naviga await expect(currentTitleTableOfWords).toContainText('the : 734 '); await expect(currentTitleTableOfWords).toHaveAttribute("title", "stem: 'the'") - await assertCellAndLink(page, gameEditor, 'id-table-0-row-0-nth', "THE BOY WHO"); - await assertCellAndLink(page, gameEditor, 'id-table-0-row-733-nth', "early the next"); - await assertCellAndLink(page, gameEditor, 'id-table-0-row-1-nth', " were the last"); + await assertCellAndLinkAriaSnapshot(page, 'id-table-0-row-0-nth', "THE BOY WHO", "gametext", expectedStringArray[0]); + await assertCellAndLinkAriaSnapshot(page, 'id-table-0-row-733-nth', "early the next", "gametext", expectedStringArray[1]); + await assertCellAndLinkAriaSnapshot(page, 'id-table-0-row-1-nth', " were the last", "gametext", expectedStringArray[2]); await page.getByLabel('id-current-table-of-words-btn').click(); await page.getByText('the Dursleys:').click(); @@ -64,10 +65,9 @@ test('test My Ghost Writer, high/narrow window (width 550 x height 1270): naviga await page.getByLabel('id-list-of-words-11-nth').click(); await page.waitForTimeout(100) - await assertCellAndLink(page, gameEditor, 'id-table-11-row-2-nth', "to be. The Dursleys", false); + await assertCellAndLinkAriaSnapshot(page, 'id-table-11-row-2-nth', "to be. The Dursleys", "gametext", expectedStringArray[3]); let col2wordsFreq = page.getByLabel('id-col2-words-frequency', { exact: true }) - await expect(col2wordsFreq).toHaveScreenshot() - await expect(col2wordsFreq).toMatchAriaSnapshot({ name: `test-classic-responsive-1270x650.txt` }); + await expect(col2wordsFreq).toMatchAriaSnapshot({ name: `test-classic-responsive-1270x650--col2wordsFreq.txt` }); page.close() }); diff --git a/static/tests/test-classic-responsive-1270x550-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-high-narrow-window-widt-10381-etween-the-value-list-tables-with-mobile-menu-2-responsive-darwin.png b/static/tests/test-classic-responsive-1270x550-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-high-narrow-window-widt-10381-etween-the-value-list-tables-with-mobile-menu-2-responsive-darwin.png deleted file mode 100644 index e774752bafc593ac762c0cdae52f6523db618e2e..0000000000000000000000000000000000000000 --- a/static/tests/test-classic-responsive-1270x550-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-high-narrow-window-widt-10381-etween-the-value-list-tables-with-mobile-menu-2-responsive-darwin.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cc1ba78f7b658aa9385f0ec6d43ea435762433826c092db238aa9e8ce93f4716 -size 135387 diff --git a/static/tests/test-classic-responsive-1270x550-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-high-narrow-window-widt-10568-etween-the-value-list-tables-with-mobile-menu-1-responsive-darwin.png b/static/tests/test-classic-responsive-1270x550-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-high-narrow-window-widt-10568-etween-the-value-list-tables-with-mobile-menu-1-responsive-darwin.png deleted file mode 100644 index 9b67f47a6a5e37a1f2568404c50284178bd2af59..0000000000000000000000000000000000000000 --- a/static/tests/test-classic-responsive-1270x550-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-high-narrow-window-widt-10568-etween-the-value-list-tables-with-mobile-menu-1-responsive-darwin.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:28d30fff2a295038354c1a1b6e5eaf24146eb491fd26cdf7eea4aecae488d40a -size 137409 diff --git a/static/tests/test-classic-responsive-1270x550-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-high-narrow-window-widt-1d5a4-etween-the-value-list-tables-with-mobile-menu-4-responsive-darwin.png b/static/tests/test-classic-responsive-1270x550-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-high-narrow-window-widt-1d5a4-etween-the-value-list-tables-with-mobile-menu-4-responsive-darwin.png deleted file mode 100644 index ffe265c0eee51cd38d4234c6e983467b0c85ffff..0000000000000000000000000000000000000000 --- a/static/tests/test-classic-responsive-1270x550-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-high-narrow-window-widt-1d5a4-etween-the-value-list-tables-with-mobile-menu-4-responsive-darwin.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:571507cfd69fb72bdc9fa92d312e5c3bccd2ce8d7bbd7fbae5e45d4db1745bc2 -size 55199 diff --git a/static/tests/test-classic-responsive-1270x550-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-high-narrow-window-widt-32087-etween-the-value-list-tables-with-mobile-menu-3-responsive-darwin.png b/static/tests/test-classic-responsive-1270x550-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-high-narrow-window-widt-32087-etween-the-value-list-tables-with-mobile-menu-3-responsive-darwin.png deleted file mode 100644 index be3e3adc09fc6aaaac429cd156457a92bd3b71ca..0000000000000000000000000000000000000000 --- a/static/tests/test-classic-responsive-1270x550-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-high-narrow-window-widt-32087-etween-the-value-list-tables-with-mobile-menu-3-responsive-darwin.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:24bce73c389f478e460d56b77249f030beca6134ccb523ac94e004dce7e12f5b -size 144800 diff --git a/static/tests/test-classic-responsive-1270x550-lite.koboldai.net.spec.ts-snapshots/test-classic-responsive-1270x650.txt b/static/tests/test-classic-responsive-1270x550-lite.koboldai.net.spec.ts-snapshots/test-classic-responsive-1270x650--col2wordsFreq.txt similarity index 100% rename from static/tests/test-classic-responsive-1270x550-lite.koboldai.net.spec.ts-snapshots/test-classic-responsive-1270x650.txt rename to static/tests/test-classic-responsive-1270x550-lite.koboldai.net.spec.ts-snapshots/test-classic-responsive-1270x650--col2wordsFreq.txt diff --git a/static/tests/test-classic-responsive-2000x650-lite.koboldai.net.spec.ts b/static/tests/test-classic-responsive-2000x650-lite.koboldai.net.spec.ts index 10f7288f9556ecfe7a479550c02e7221cb56ff34..c05752b113b0d1f8efe3f5bfe0a9c6353d4efc90 100644 --- a/static/tests/test-classic-responsive-2000x650-lite.koboldai.net.spec.ts +++ b/static/tests/test-classic-responsive-2000x650-lite.koboldai.net.spec.ts @@ -1,21 +1,21 @@ // Playwright E2E test for My Ghost Writer "Text Stats" feature on wide/low window (2000x650) import { test, expect } from '@playwright/test'; -import { assertCellAndLink } from './test-helper' +import { assertCellAndLinkAriaSnapshot, uploadFileWithPageAndFilepath } from './test-helper' const testStoryJsonTxt = `${import.meta.dirname}/../../tests/events/very_long_text.json` +const expectedStringArray = [ + "THE BOY WHO LIVEDMr. and Mrs. Dursley, of number four, Privet Drive, were proud to say that they were perfectly normal, thank you very much. They were the last people you'd expect to be involved in anything strange or mysterious, because they just didn't hold with such nonsense.Mr. Dursley was the director of a firm called Grunnings, which made drills. He was a big, beefy man with hardly any neck, although he did have a very large mustache. Mrs. Dursley was thin and blonde and had nearly twice the usual amount of neck, which came in very useful as she spent so much of her time craning over garden fences, spying on the neighbors. The Dursley s had a small son called Dudley and in their opinion there was no finer boy anywhere.The Dursleys had everything they wanted, but they also had a secret, and their greatest fear was that somebody would discover it. They didn't think they could bear it if anyone found out about the Potters. Mrs. Potter was Mrs. Dursley's sister, but they hadn't", + "\"Shouldn'ta lost me temper,\" he said ruefully, \"but it didn't work anyway. Meant ter turn him into a pig, but I suppose he was so much like a pig anyway there wasn't much left ter do.\"He cast a sideways look at Harry under his bushy eyebrows.\"Be grateful if yeh didn't mention that ter anyone at Hogwarts,\" he said. \"I'm — er — not supposed ter do magic, strictly speakin'. I was allowed ter do a bit ter follow yeh an' get yer letters to yeh an' stuff — one o' the reasons I was so keen ter take on the job — \"\"Why aren't you supposed to do magic?\" asked Harry.\"Oh, well — I was at Hogwarts meself but I — er — got expelled, ter tell yeh the truth. In me third year. They snapped me wand in half an' everything. But Dumbledore let me stay on as gamekeeper. Great man, Dumbledore.\"\"Why were you expelled?\"\"It's gettin' late and we've got lots ter do tomorrow,\" said Hagrid loudly. \"Gotta get up ter town, get all yer books an' that.\"He took off his thick black coat and threw it to Harry.\"You can kip under that,\" he said. \"Don' mind if it wriggles a bit, I think I still got a couple o' dormice in one o' the pockets.\"Harry woke early the next morning. Although he could", + "Mr. and Mrs. Dursley, of number four, Privet Drive, were proud to say that they were perfectly normal, thank you very much. They were the last people you'd expect to be involved in anything strange or mysterious, because they just didn't hold with such nonsense.Mr. Dursley was the director of a firm called Grunnings, which made drills. He was a big, beefy man with hardly any neck, although he did have a very large mustache. Mrs. Dursley was thin and blonde and had nearly twice the usual amount of neck, which came in very useful as she spent so much of her time craning over garden fences, spying on the neighbors. The Dursley s had a small son called Dudley and in their opinion there was no finer boy anywhere.The Dursleys had everything they wanted, but they also had a secret, and their greatest fear was that somebody would discover it. They didn't think they could bear it if anyone found out about the Potters. Mrs. Potter was Mrs. Dursley's sister, but they hadn'tmet for several years; in fact, Mrs. Dursley pretended she didn't have a sister, because her sister and her good-for-nothing husband were as unDursleyish as it was possible to be. The Dursleys shuddered to think what the neighbors would say if the Potters arrived in the street. The Dursleys knew that the Potters had a small son, too, but they had never even seen him.", + "The Dursleys had everything they wanted, but they also had a secret, and their greatest fear was that somebody would discover it. They didn't think they could bear it if anyone found out about the Potters. Mrs. Potter was Mrs. Dursley's sister, but they hadn'tmet for several years; in fact, Mrs. Dursley pretended she didn't have a sister, because her sister and her good-for-nothing husband were as unDursleyish as it was possible to be. The Dursleys shuddered to think what the neighbors would say if the Potters arrived in the street. The Dursleys knew that the Potters had a small son, too, but they had never even seen him.This boy was another good reason for keeping the Potters away; they didn't want Dudley mixing with a child like that.When Mr. and Mrs. Dursley woke up on the dull, gray Tuesday our story starts, there was nothing about the cloudy sky outside to suggest that strange and mysterious things would soon be happening all over the country. Mr. Dursley hummed as he picked out his most boring tie for work, and Mrs. Dursley gossiped away happily as she wrestled a screaming Dudley into his high chair.None of them noticed a large, tawny owl flutter past the window.At half past eight, Mr. Dursley picked up his briefcase, pecked Mrs. Dursley on the cheek, and tried to kiss Dudley good-bye but missed, because Dudley was now having a tantrum and throwing his cereal at the walls. \"Little tyke,\" chortled Mr. Dursley as he left the house. He got into his car and backed out of number four's drive." +] test('test My Ghost Writer, wide/low window (2000x650): navigate between the value list/tables with mobile menu', async ({ page }) => { await page.setViewportSize({ width: 2000, height: 650 }); await page.goto('http://localhost:8000/'); await page.getByRole('button', { name: 'Set UI' }).click(); - await page.getByRole('link', { name: 'Save / Load' }).click(); - await page.waitForTimeout(100) - const fileChooserPromise = page.waitForEvent('filechooser'); - await page.getByRole('button', { name: '📁 Open File' }).click(); - const fileChooser = await fileChooserPromise; - await fileChooser.setFiles(testStoryJsonTxt); - await page.waitForTimeout(300) + await uploadFileWithPageAndFilepath(page, testStoryJsonTxt) await page.getByRole('link', { name: 'Settings' }).click(); await page.getByRole('link', { name: 'Tokens' }).click(); @@ -49,9 +49,9 @@ test('test My Ghost Writer, wide/low window (2000x650): navigate between the val await expect(currentTitleTableOfWords).toContainText('the : 734 '); await expect(currentTitleTableOfWords).toHaveAttribute("title", "stem: 'the'") - await assertCellAndLink(page, gameEditor, 'id-table-0-row-0-nth', "THE BOY WHO"); - await assertCellAndLink(page, gameEditor, 'id-table-0-row-733-nth', "woke early the next"); - await assertCellAndLink(page, gameEditor, 'id-table-0-row-1-nth', "They were the last people"); + await assertCellAndLinkAriaSnapshot(page, 'id-table-0-row-0-nth', "THE BOY WHO", "gametext", expectedStringArray[0]); + await assertCellAndLinkAriaSnapshot(page, 'id-table-0-row-733-nth', "woke early the next", "gametext", expectedStringArray[1]); + await assertCellAndLinkAriaSnapshot(page, 'id-table-0-row-1-nth', "They were the last people", "gametext", expectedStringArray[2]); await page.getByText('the Dursleys:').click(); await page.waitForTimeout(100) @@ -60,9 +60,9 @@ test('test My Ghost Writer, wide/low window (2000x650): navigate between the val await page.getByLabel('id-list-of-words-11-nth').click(); await page.waitForTimeout(100) - await assertCellAndLink(page, gameEditor, 'id-table-11-row-2-nth', "to be. The Dursleys shuddered", false); + await assertCellAndLinkAriaSnapshot(page, 'id-table-11-row-2-nth', "to be. The Dursleys shuddered", "gametext", expectedStringArray[3]); let col2wordsFreq = page.getByLabel('id-col2-words-frequency', { exact: true }) - await expect(col2wordsFreq).toMatchAriaSnapshot({ name: `test-classic-responsive-650x2000.txt` }); + await expect(col2wordsFreq).toMatchAriaSnapshot({ name: `test-classic-responsive-650x2000--col2wordsFreq.txt` }); page.close() }); diff --git a/static/tests/test-classic-responsive-2000x650-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-wide-low-window-2000x65-2c7ba-etween-the-value-list-tables-with-mobile-menu-2-responsive-darwin.png b/static/tests/test-classic-responsive-2000x650-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-wide-low-window-2000x65-2c7ba-etween-the-value-list-tables-with-mobile-menu-2-responsive-darwin.png deleted file mode 100644 index 9c462d2985f2591e0a267bdeb3f5699aeb41ad2f..0000000000000000000000000000000000000000 --- a/static/tests/test-classic-responsive-2000x650-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-wide-low-window-2000x65-2c7ba-etween-the-value-list-tables-with-mobile-menu-2-responsive-darwin.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:04ef04c32f24cca90c8d6e14be8a60bb3c926e771f296a7639e8d21085bc6ff1 -size 99406 diff --git a/static/tests/test-classic-responsive-2000x650-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-wide-low-window-2000x65-9d2db-etween-the-value-list-tables-with-mobile-menu-3-responsive-darwin.png b/static/tests/test-classic-responsive-2000x650-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-wide-low-window-2000x65-9d2db-etween-the-value-list-tables-with-mobile-menu-3-responsive-darwin.png deleted file mode 100644 index 9ff6364bb535c57bc3262bc60f6872aab8d4544b..0000000000000000000000000000000000000000 --- a/static/tests/test-classic-responsive-2000x650-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-wide-low-window-2000x65-9d2db-etween-the-value-list-tables-with-mobile-menu-3-responsive-darwin.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2ffdcc02efab8b371aad5155f659555a923070f753d9136dfeecc9ab3e0d63fa -size 97596 diff --git a/static/tests/test-classic-responsive-2000x650-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-wide-low-window-2000x65-d0ebe-etween-the-value-list-tables-with-mobile-menu-1-responsive-darwin.png b/static/tests/test-classic-responsive-2000x650-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-wide-low-window-2000x65-d0ebe-etween-the-value-list-tables-with-mobile-menu-1-responsive-darwin.png deleted file mode 100644 index a2c9914322c525e5c730442dba1626862cad940d..0000000000000000000000000000000000000000 --- a/static/tests/test-classic-responsive-2000x650-lite.koboldai.net.spec.ts-snapshots/test-My-Ghost-Writer-wide-low-window-2000x65-d0ebe-etween-the-value-list-tables-with-mobile-menu-1-responsive-darwin.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:68823b4e96efb839f45979669dd4404cc64b35b24414cf485f0fde3d37f60549 -size 89780 diff --git a/static/tests/test-classic-responsive-2000x650-lite.koboldai.net.spec.ts-snapshots/test-classic-responsive-650x2000.txt b/static/tests/test-classic-responsive-2000x650-lite.koboldai.net.spec.ts-snapshots/test-classic-responsive-650x2000--col2wordsFreq.txt similarity index 100% rename from static/tests/test-classic-responsive-2000x650-lite.koboldai.net.spec.ts-snapshots/test-classic-responsive-650x2000.txt rename to static/tests/test-classic-responsive-2000x650-lite.koboldai.net.spec.ts-snapshots/test-classic-responsive-650x2000--col2wordsFreq.txt diff --git a/static/tests/test-helper.ts b/static/tests/test-helper.ts index ae50c39285cc8052234de51161a30064448da4ce..01275dfc4ba7dafb322effda98826ebcda31712a 100644 --- a/static/tests/test-helper.ts +++ b/static/tests/test-helper.ts @@ -42,7 +42,7 @@ export const fileWriter = async (filePath: string, data: string): Promise } } -export const loopOverTablesAndClickOnUrls = async (page: Page, cellObj: CellObject, timeout=50) => { +export const loopOverTablesAndClickOnUrls = async (page: Page, cellObj: CellObject, timeout=50, ariaSnapshotName: string) => { let cellLabel = `id-table-${cellObj["table"]}-row-${cellObj["row"]}-nth` try { console.log(`current aria-label:${cellLabel}...`) @@ -54,7 +54,7 @@ export const loopOverTablesAndClickOnUrls = async (page: Page, cellObj: CellObje expect(currentInnerText).toBe(cellObj.word) await currentCellElement.click({timeout: 1000}); await page.waitForTimeout(timeout) - await expect(page.getByLabel('editor')).toHaveScreenshot(/** {stylePath: `${import.meta.dirname}/../index.css`} */); + await expect(page.getByLabel('editor')).toMatchAriaSnapshot({ name: ariaSnapshotName }); } catch (err) { console.log("cellLabel:", cellLabel, "#") console.log("err:", err, "#") @@ -107,7 +107,7 @@ export async function testWithLoop(page: Page, testLLMTextFilePath: string, cell console.log("try with a new array of tables/rows...") for (let idx in cellArray2) { - await loopOverTablesAndClickOnUrls(page, cellArray2[idx], 100) + await loopOverTablesAndClickOnUrls(page, cellArray2[idx], 100, `test-loop-${assertTitleString}-${idx}.txt`) } console.log("end!") } @@ -123,7 +123,12 @@ export async function assertCellAndLink(page: Page, gameEditor: Locator, idCell: } export async function assertCellAndLinkAriaSnapshot(page: Page, idCell: string, expectedCellString: string, idElementSnapshot: string, expectedSnapshotString: string) { - await assertCellAndLink(page, page.locator("not_used"), idCell, expectedCellString, false) + // await assertCellAndLink(page, page.locator("not_used"), idCell, expectedCellString, false) + let tableOfWordsElNth0 = page.getByLabel(idCell).getByRole('cell'); + await expect(tableOfWordsElNth0).toMatchAriaSnapshot(`- cell "${idCell}-link": "${expectedCellString}"`); + await page.getByLabel(`${idCell}-link`).click(); + await page.waitForTimeout(100); + await expectOnlyVisibleTextInElement(page, idElementSnapshot, expectedSnapshotString) } @@ -189,4 +194,16 @@ export async function scrollToBottomById(page: Page, idElement: string) { el.scrollTop = el.scrollHeight; } }, idElement); +} + +export async function uploadFileWithPageAndFilepath(page: Page, filepath: string) { + console.log(`preparing uploading of file '${filepath}'!`) + await page.getByRole('link', { name: 'Save / Load' }).click(); + await page.waitForTimeout(100) + const fileChooserPromise = page.waitForEvent('filechooser'); + await page.getByRole('button', { name: '📁 Open File' }).click(); + const fileChooser = await fileChooserPromise; + await fileChooser.setFiles(filepath); + await page.waitForTimeout(300) + console.log(`file '${filepath}' uploaded!!`) } \ No newline at end of file