How to use flushUntilIndex method in unexpected

Best JavaScript code snippet using unexpected

assertions.js

Source:assertions.js Github

copy

Full Screen

...216 label: 'should not match',217 diff(output) {218 output.inline = false;219 let lastIndex = 0;220 function flushUntilIndex(i) {221 if (i > lastIndex) {222 output.text(subject.substring(lastIndex, i));223 lastIndex = i;224 }225 }226 subject.replace(new RegExp(regexp.source, 'g'), ($0, index) => {227 flushUntilIndex(index);228 lastIndex += $0.length;229 output.removedHighlight($0);230 });231 flushUntilIndex(subject.length);232 return output;233 },234 });235 }236 )237 );238 expect.addAssertion(239 '<object> [not] to have own property <string|Symbol>',240 (expect, subject, key) => {241 expect(242 Object.prototype.hasOwnProperty.call(subject, key),243 '[not] to be truthy'244 );245 return subject[key];246 }247 );248 expect.addAssertion(249 '<object> to have (enumerable|unenumerable|configurable|unconfigurable|writable|unwritable|readonly) property <string|Symbol>',250 (expect, subject, key) => {251 let attribute = expect.alternations[0];252 let negated = false;253 if (attribute.indexOf('un') === 0) {254 attribute = attribute.substr(2);255 negated = true;256 } else if (attribute === 'readonly') {257 attribute = 'writable';258 negated = true;259 }260 const descriptor = Object.getOwnPropertyDescriptor(subject, key);261 expect(descriptor, 'to be defined');262 expect(descriptor[attribute] !== negated, 'to be true');263 return subject[key];264 }265 );266 expect.addAssertion(267 '<object> [not] to have property <string|Symbol>',268 (expect, subject, key) => {269 const subjectType = expect.findTypeOf(subject);270 const subjectKey = subjectType.is('function')271 ? subject[key]272 : subjectType.valueForKey(subject, key);273 expect(subjectKey, '[!not] to be undefined');274 return subjectKey;275 }276 );277 expect.addAssertion(278 '<object> to have [own] property <string|Symbol> <any>',279 (expect, subject, key, expectedPropertyValue) =>280 expect(subject, 'to have [own] property', key).then(281 (actualPropertyValue) => {282 expect.argsOutput = function () {283 this.appendInspected(key)284 .sp()285 .error('with a value of')286 .sp()287 .appendInspected(expectedPropertyValue);288 };289 expect(actualPropertyValue, 'to equal', expectedPropertyValue);290 return actualPropertyValue;291 }292 )293 );294 expect.addAssertion(295 '<object> [not] to [only] have [own] properties <array>',296 (expect, subject, propertyNames) => {297 const unsupportedPropertyNames = propertyNames.filter((propertyName) => {298 const type = typeof propertyName;299 return type !== 'string' && type !== 'number' && type !== 'symbol';300 });301 if (unsupportedPropertyNames.length > 0) {302 expect.errorMode = 'nested';303 expect.fail(function () {304 this.error(305 'All expected properties must be passed as strings, symbols, or numbers, but these are not:'306 ).indentLines();307 unsupportedPropertyNames.forEach(function (propertyName) {308 this.nl().i().appendInspected(propertyName);309 }, this);310 this.outdentLines();311 });312 }313 if (expect.flags.only) {314 if (expect.flags.not) {315 expect.errorMode = 'bubble';316 expect.fail(317 'The "not" flag cannot be used together with "to only have properties".'318 );319 }320 if (expect.flags.own) {321 expect.errorMode = 'bubble';322 expect.fail(323 'The "own" flag cannot be used together with "to only have properties".'324 );325 }326 const subjectType = expect.subjectType;327 const subjectKeys = subjectType.getKeys(subject).filter(328 (key) =>329 // include only those keys whose value is not undefined330 typeof subjectType.valueForKey(subject, key) !== 'undefined'331 );332 expect.withError(333 () => {334 expect(subjectKeys.length === propertyNames.length, 'to be true');335 // now catch differing property names336 const keyInValue = {};337 propertyNames.forEach((key) => {338 keyInValue[key] = true;339 });340 subjectKeys.forEach((key) =>341 expect(342 Object.prototype.hasOwnProperty.call(keyInValue, key),343 'to be true'344 )345 );346 },347 () => {348 expect.fail({349 diff: (output, diff, inspect, equal) => {350 output.inline = true;351 const keyInValue = {};352 propertyNames.forEach((key) => {353 keyInValue[key] = true;354 });355 subjectType.prefix(output, subject);356 output.nl().indentLines();357 subjectKeys.forEach((key, index) => {358 const propertyOutput = subjectType.property(359 output.clone(),360 key,361 inspect(subjectType.valueForKey(subject, key))362 );363 const delimiterOutput = subjectType.delimiter(364 output.clone(),365 index,366 subjectKeys.length367 );368 output369 .i()370 .block(function () {371 this.append(propertyOutput).amend(delimiterOutput);372 if (373 !Object.prototype.hasOwnProperty.call(keyInValue, key)374 ) {375 this.sp().annotationBlock(function () {376 this.error('should be removed');377 });378 } else {379 delete keyInValue[key];380 }381 })382 .nl();383 });384 // list any remaining value properties as missing385 Object.keys(keyInValue).forEach((valueKey) => {386 output387 .i()388 .annotationBlock(function () {389 this.error('missing').sp().append(inspect(valueKey));390 })391 .nl();392 });393 output.outdentLines();394 subjectType.suffix(output, subject);395 return output;396 },397 });398 }399 );400 } else {401 propertyNames.forEach((propertyName) => {402 expect(403 subject,404 '[not] to have [own] property',405 typeof propertyName === 'number'406 ? String(propertyName)407 : propertyName408 );409 });410 }411 }412 );413 expect.addAssertion(414 '<object> to have [own] properties <object>',415 (expect, subject, properties) => {416 expect.withError(417 () => {418 Object.keys(properties).forEach((property) => {419 const value = properties[property];420 if (typeof value === 'undefined') {421 expect(subject, 'not to have [own] property', property);422 } else {423 expect(subject, 'to have [own] property', property, value);424 }425 });426 },427 (e) => {428 expect.fail({429 diff(output, diff) {430 output.inline = false;431 const expected = extend({}, properties);432 const actual = {};433 const propertyNames = expect.findTypeOf(subject).getKeys(subject);434 // Might put duplicates into propertyNames, but that does not matter:435 for (const propertyName in subject) {436 if (437 !Object.prototype.hasOwnProperty.call(subject, propertyName)438 ) {439 propertyNames.push(propertyName);440 }441 }442 propertyNames.forEach((propertyName) => {443 if (444 (!expect.flags.own ||445 Object.prototype.hasOwnProperty.call(446 subject,447 propertyName448 )) &&449 !(propertyName in properties)450 ) {451 expected[propertyName] = subject[propertyName];452 }453 if (454 (!expect.flags.own ||455 Object.prototype.hasOwnProperty.call(456 subject,457 propertyName458 )) &&459 !(propertyName in actual)460 ) {461 actual[propertyName] = subject[propertyName];462 }463 });464 return utils.wrapConstructorNameAroundOutput(465 diff(actual, expected),466 subject467 );468 },469 });470 }471 );472 }473 );474 expect.addAssertion(475 '<string|array-like> [not] to have length <number>',476 (expect, subject, length) => {477 if (!expect.flags.not) {478 expect.errorMode = 'nested';479 }480 expect(subject.length, '[not] to be', length);481 }482 );483 expect.addAssertion(484 '<string|array-like> [not] to be empty',485 (expect, subject) => {486 expect(subject, '[not] to have length', 0);487 }488 );489 expect.addAssertion(490 '<string|array-like|object> to be non-empty',491 (expect, subject) => {492 expect(subject, 'not to be empty');493 }494 );495 expect.addAssertion(496 '<object> to [not] [only] have keys <array>',497 (expect, subject, keys) => {498 const keysInSubject = {};499 const subjectType = expect.findTypeOf(subject);500 const subjectKeys = subjectType.getKeys(subject);501 subjectKeys.forEach((key) => {502 keysInSubject[key] = true;503 });504 if (expect.flags.not && keys.length === 0) {505 return;506 }507 const hasKeys = keys.every((key) => keysInSubject[key]);508 if (expect.flags.only) {509 expect(hasKeys, 'to be truthy');510 expect.withError(511 () => {512 expect(subjectKeys.length === keys.length, '[not] to be truthy');513 },514 () => {515 expect.fail({516 diff:517 !expect.flags.not &&518 ((output, diff, inspect, equal) => {519 output.inline = true;520 const keyInValue = {};521 keys.forEach((key) => {522 keyInValue[key] = true;523 });524 const subjectIsArrayLike = subjectType.is('array-like');525 subjectType.prefix(output, subject);526 output.nl().indentLines();527 subjectKeys.forEach((key, index) => {528 const propertyOutput = subjectType.property(529 output.clone(),530 key,531 inspect(subjectType.valueForKey(subject, key)),532 subjectIsArrayLike533 );534 const delimiterOutput = subjectType.delimiter(535 output.clone(),536 index,537 subjectKeys.length538 );539 output540 .i()541 .block(function () {542 this.append(propertyOutput).amend(delimiterOutput);543 if (!keyInValue[key]) {544 this.sp().annotationBlock(function () {545 this.error('should be removed');546 });547 }548 })549 .nl();550 });551 output.outdentLines();552 subjectType.suffix(output, subject);553 return output;554 }),555 });556 }557 );558 } else {559 expect(hasKeys, '[not] to be truthy');560 }561 }562 );563 expect.addAssertion('<object> [not] to be empty', (expect, subject) => {564 if (565 expect.flags.not &&566 !expect.findTypeOf(subject).getKeys(subject).length567 ) {568 return expect.fail();569 }570 expect(subject, 'to [not] only have keys', []);571 });572 expect.addAssertion(573 '<object> not to have keys <array>',574 (expect, subject, keys) => {575 expect(subject, 'to not have keys', keys);576 }577 );578 expect.addAssertion(579 '<object> not to have key <string>',580 (expect, subject, value) => {581 expect(subject, 'to not have keys', [value]);582 }583 );584 expect.addAssertion(585 '<object> not to have keys <string+>',586 function (expect, subject, value) {587 expect(588 subject,589 'to not have keys',590 Array.prototype.slice.call(arguments, 2)591 );592 }593 );594 expect.addAssertion(595 '<object> to [not] [only] have key <string>',596 (expect, subject, value) => {597 expect(subject, 'to [not] [only] have keys', [value]);598 }599 );600 expect.addAssertion(601 '<object> to [not] [only] have keys <string+>',602 function (expect, subject) {603 expect(604 subject,605 'to [not] [only] have keys',606 Array.prototype.slice.call(arguments, 2)607 );608 }609 );610 expect.addAssertion(611 '<string> [not] to contain <string+>',612 function (expect, subject) {613 const args = Array.prototype.slice.call(arguments, 2);614 args.forEach((arg) => {615 if (arg === '') {616 throw new Error(617 `The '${expect.testDescription}' assertion does not support the empty string`618 );619 }620 });621 expect.withError(622 () => {623 args.forEach((arg) => {624 expect(subject.indexOf(arg) !== -1, '[not] to be truthy');625 });626 },627 (e) => {628 expect.fail({629 diff(output) {630 output.inline = false;631 let lastIndex = 0;632 function flushUntilIndex(i) {633 if (i > lastIndex) {634 output.text(subject.substring(lastIndex, i));635 lastIndex = i;636 }637 }638 if (expect.flags.not) {639 subject.replace(640 new RegExp(641 args642 .map((arg) => utils.escapeRegExpMetaChars(arg))643 .join('|'),644 'g'645 ),646 ($0, index) => {647 flushUntilIndex(index);648 lastIndex += $0.length;649 output.removedHighlight($0);650 }651 );652 flushUntilIndex(subject.length);653 } else {654 const ranges = [];655 args.forEach((arg) => {656 let needle = arg;657 let partial = false;658 while (needle.length > 1) {659 let found = false;660 lastIndex = -1;661 let index;662 do {663 index = subject.indexOf(needle, lastIndex + 1);664 if (index !== -1) {665 found = true;666 ranges.push({667 startIndex: index,668 endIndex: index + needle.length,669 partial,670 });671 }672 lastIndex = index;673 } while (lastIndex !== -1);674 if (found) {675 break;676 }677 needle = arg.substr(0, needle.length - 1);678 partial = true;679 }680 });681 lastIndex = 0;682 ranges683 .sort((a, b) => a.startIndex - b.startIndex)684 .forEach(({ startIndex, endIndex, partial }) => {685 flushUntilIndex(startIndex);686 const firstUncoveredIndex = Math.max(startIndex, lastIndex);687 if (endIndex > firstUncoveredIndex) {688 if (partial) {689 output.partialMatch(690 subject.substring(firstUncoveredIndex, endIndex)691 );692 } else {693 output.match(694 subject.substring(firstUncoveredIndex, endIndex)695 );696 }697 lastIndex = endIndex;698 }699 });700 flushUntilIndex(subject.length);701 }702 return output;703 },704 });705 }706 );707 }708 );709 expect.addAssertion(710 [711 '<array-like> to [only] contain <any+>',712 '<array-like> [not] to contain <any+>',713 ],714 function (expect, subject) {...

Full Screen

Full Screen

Using AI Code Generation

copy

Full Screen

1const unexpected = require('unexpected');2const unexpectedHtmlLike = require('unexpected-htmllike');3const unexpectedReact = require('unexpected-react');4const expect = unexpected.clone().use(unexpectedHtmlLike).use(unexpectedReact);5expect.addAssertion('<ReactElement> to have rendered <ReactElement>', (expect, subject, value) => {6 return expect(subject, 'to have rendered', expect(subject, 'to have rendered', value));7});8expect.addAssertion('<ReactElement> to have rendered <ReactElement>', (expect, subject, value) => {9 return expect(subject, 'to have rendered', expect(subject, 'to have rendered', value));10});11expect.addAssertion('<ReactElement> to have rendered <ReactElement>', (expect, subject, value) => {12 return expect(subject, 'to have rendered', expect(subject, 'to have rendered', value));13});14expect.addAssertion('<ReactElement> to have rendered <ReactElement>', (expect, subject, value) => {15 return expect(subject, 'to have rendered', expect(subject, 'to have rendered', value));16});17expect.addAssertion('<ReactElement> to have rendered <ReactElement>', (expect, subject, value) => {18 return expect(subject, 'to have rendered', expect(subject, 'to have rendered', value));19});20expect.addAssertion('<ReactElement> to have rendered <ReactElement>', (expect, subject, value) => {21 return expect(subject, 'to have rendered', expect(subject, 'to have rendered', value));22});23expect.addAssertion('<ReactElement> to have rendered <ReactElement>', (expect, subject, value) => {24 return expect(subject, 'to have rendered', expect(subject, 'to have rendered', value));25});26expect.addAssertion('<ReactElement> to have rendered <ReactElement>', (expect, subject, value) => {27 return expect(subject, 'to have rendered', expect(subject, 'to have rendered', value));28});29expect.addAssertion('<ReactElement> to have rendered <ReactElement>', (expect, subject, value) => {30 return expect(subject, 'to have rendered', expect(subject, 'to have rendered', value));31});32expect.addAssertion('<ReactElement> to have rendered <ReactElement>', (expect, subject, value) => {33 return expect(subject, 'to have rendered', expect(subject, 'to have rendered', value));34});35expect.addAssertion('<ReactElement> to

Full Screen

Using AI Code Generation

copy

Full Screen

1const sinon = require('sinon');2const expect = require('unexpected-sinon');3const stub = sinon.stub();4stub.withArgs(1).returns(1);5stub.withArgs(2).returns(2);6expect(stub, 'was called with', 1);7expect(stub, 'was called with', 2);

Full Screen

Using AI Code Generation

copy

Full Screen

1var expect = require('unexpected').clone();2expect.addAssertion('<any> to be greater than <number>', function (expect, subject, value) {3 expect(subject, 'to be greater than or equal to', value);4});5expect.addAssertion('<any> to be greater than <number>', function (expect, subject, value) {6 expect(subject, 'to be greater than or equal to', value);7});8expect.addAssertion('<any> to be greater than <number>', function (expect, subject, value) {9 expect(subject, 'to be greater than or equal to', value);10});11expect.addAssertion('<any> to be greater than <number>', function (expect, subject, value) {12 expect(subject, 'to be greater than or equal to', value);13});14expect.addAssertion('<any> to be greater than <number>', function (expect, subject, value) {15 expect(subject, 'to be greater than or equal to', value);16});17expect.addAssertion('<any> to be greater than <number>', function (expect, subject, value) {18 expect(subject, 'to be greater than or equal to', value);19});20expect.addAssertion('<any> to be greater than <number>', function (expect, subject, value) {21 expect(subject, 'to be greater than or equal to', value);22});23expect.addAssertion('<any> to be greater than <number>', function (expect, subject, value) {24 expect(subject, 'to be greater than or equal to', value);25});26expect.addAssertion('<any> to be greater than <number>', function (expect, subject, value) {27 expect(subject, 'to be greater than or equal to', value);28});29expect.addAssertion('<any> to be greater than <number>', function (expect, subject, value) {30 expect(subject, 'to be greater than or equal to', value);31});32expect.addAssertion('<any> to be greater than <number>', function (expect, subject, value) {33 expect(subject, 'to be greater than or equal to', value);34});35expect.addAssertion('<any> to be greater than <number>', function (expect, subject, value) {36 expect(subject, 'to be greater than or equal to', value);37});38expect.addAssertion('<any> to be greater than <number>', function (expect, subject, value) {39 expect(subject, 'to be greater than or equal

Full Screen

Using AI Code Generation

copy

Full Screen

1import React from 'react';2import { render, flushUntilIndex } from 'unexpected-dom';3import { render as reactRender } from 'react-dom';4import App from './App';5describe('App', () => {6 it('should render the App', async () => {7 const root = document.createElement('div');8 reactRender(<App />, root);9 await flushUntilIndex(1);10 expect(root, 'to have rendered', <div>App</div>);11 });12});13import React from 'react';14const App = () => {15 return <div>App</div>;16};17export default App;

Full Screen

Using AI Code Generation

copy

Full Screen

1const { spy } = require('sinon');2const { createSpy, flushUntilIndex } = require('unexpected-sinon');3const callback = spy();4const mySpy = createSpy(callback);5mySpy('first call');6mySpy('second call');7mySpy('third call');8flushUntilIndex(callback, 1);9flushUntilIndex(callback, 8) or flushUntilIndex(callback, -9) will flush all the calls until the index 8 or

Full Screen

Using AI Code Generation

copy

Full Screen

1const { expect } = require('unexpected');2const { flushUntilIndex } = require('unexpected-snapshot');3const { snapshot } = require('unexpected-snapshot');4const { flushUntilIndex } = snapshot;5const { expect, snapshot } = require('unexpected-snapshot');6const { flushUntilIndex } = snapshot;7const { expect, snapshot } = require('unexpected-snapshot');8const { flushUntilIndex } = expect;9const { expect, snapshot } = require('unexpected-snapshot');10const { flushUntilIndex } = expect.output;11const { expect, snapshot } = require('unexpected-snapshot');12const { flushUntilIndex } = expect.output.clone();13const { expect, snapshot } = require('unexpected-snapshot');14const { flushUntilIndex } = expect.output.clone().text;15const { expect, snapshot } = require('unexpected-snapshot');16const { flushUntilIndex } = expect.output.clone().text.clone();17const { expect, snapshot } = require('unexpected-snapshot');18const { flushUntilIndex } = expect.output.clone().text.clone().ansi;19const { expect, snapshot } = require('unexpected-snapshot');20const { flushUntilIndex } = expect.output.clone().text.clone().ansi.clone();21const { expect, snapshot } = require('unexpected-snapshot');22const { flushUntilIndex } = expect.output.clone().text.clone().ansi.clone().html;23const { expect, snapshot } = require('unexpected-snapshot');24const { flushUntilIndex } = expect.output.clone().text.clone().ansi.clone().html.clone();25const { expect, snapshot } = require('unexpected-snapshot');26const { flushUntilIndex } = expect.output.clone().text.clone().ansi.clone().html.clone().clone

Full Screen

Using AI Code Generation

copy

Full Screen

1const unexpected = require('unexpected');2const unexpectedSinon = require('unexpected-sinon');3unexpected.use(unexpectedSinon);4const expect = unexpected.clone()5 .use(unexpectedSinon);6expect.addAssertion('<any> to call the console', (expect, subject) => {7 expect(subject, 'to call the console log');8});9expect.addAssertion('<any> to call the console log', (expect, subject) => {10 expect(subject, 'to call console.log');11});12expect.addAssertion('<any> to call console.log', (expect, subject) => {13 expect(subject, 'to call console.log');14});15expect.addAssertion('<any> to call console.log', (expect, subject) => {16 expect(subject, 'to call console.log');17});18expect.addAssertion('<any> to call console.log', (expect, subject) => {19 expect(subject, 'to call console.log');20});21expect.addAssertion('<any> to call console.log', (expect, subject) => {22 expect(subject, 'to call console.log');23});24expect.addAssertion('<any> to call console.log', (expect, subject) => {25 expect(subject, 'to call console.log');26});27expect.addAssertion('<any> to call console.log', (expect, subject) => {28 expect(subject, 'to call console.log');29});30expect.addAssertion('<any> to call console.log', (expect, subject) => {31 expect(subject, 'to call console.log');32});33expect.addAssertion('<any> to call console.log', (expect, subject) => {34 expect(subject, 'to call console.log');35});36expect.addAssertion('<any> to call console.log', (expect, subject) => {37 expect(subject, 'to call console.log');38});39const test = () => {40 console.log('1');41 console.log('2');42 console.log('3');43 console.log('4');44 console.log('5');45 console.log('6');46 console.log('7');47 console.log('8');48 console.log('9');49 console.log('10');50 console.log('11');51 console.log('12');52 console.log('13');53 console.log('14');54 console.log('15');55 console.log('16');56 console.log('17');57 console.log('18');58 console.log('19');

Full Screen

Using AI Code Generation

copy

Full Screen

1const unexpectedCalls = require('unexpected-calls');2const mock = unexpectedCalls.create();3const obj = {4 method: function() {5 return 'hello';6 }7};8mock(obj, 'method').callsArgWith(0, 'world');9obj.method(function(str) {10 console.log(str);11});12mock.flushUntilIndex(0);13obj.method(function(str) {14 console.log(str);15});16mock.flushUntilIndex(1);17obj.method(function(str) {18 console.log(str);19});20mock.flushUntilIndex(2);21obj.method(function(str) {22 console.log(str);23});24mock.flushUntilIndex(3);25obj.method(function(str) {26 console.log(str);27});28mock.flushUntilIndex(4);29obj.method(function(str) {30 console.log(str);31});32mock.flushUntilIndex(5);33const unexpectedCalls = require('unexpected-calls');34const mock = unexpectedCalls.create();35const obj = {36 method: function() {37 return 'hello';38 }39};40mock(obj, 'method').callsArgWith(0, 'world');41obj.method(function(str) {42 console.log(str);43});44mock.flushUntilIndex(0);45obj.method(function(str) {46 console.log(str);47});48mock.flushUntilIndex(1);49obj.method(function(str) {50 console.log(str);51});52mock.flushUntilIndex(2);53obj.method(function(str) {54 console.log(str);55});56mock.flushUntilIndex(3);57obj.method(function(str) {58 console.log(str);59});60mock.flushUntilIndex(4);61obj.method(function(str) {62 console.log(str);63});64mock.flushUntilIndex(5);65const unexpectedCalls = require('unexpected-calls');66const mock = unexpectedCalls.create();67const obj = {68 method: function() {69 return 'hello';70 }71};72mock(obj, 'method').calls

Full Screen

Using AI Code Generation

copy

Full Screen

1const { flushUntilIndex } = require('unexpected-snapshot');2expect.addAssertion('<any> to have snapshot [with index]', (expect, subject, index) => {3 expect(subject, 'to equal snapshot', index);4});5expect.addAssertion('<any> to have snapshot [without index]', (expect, subject) => {6 expect(subject, 'to equal snapshot');7});8describe('test', () => {

Full Screen

Automation Testing Tutorials

Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.

LambdaTest Learning Hubs:

YouTube

You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.

Run unexpected automation tests on LambdaTest cloud grid

Perform automation testing on 3000+ real desktop and mobile devices online.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful