How to use mutate method in stryker-parent

Best JavaScript code snippet using stryker-parent

index.spec.js

Source:index.spec.js Github

copy

Full Screen

1import deepFreeze from '../src/index'2describe('deepFreeze:object', () => {3 it('returns-a-cloned-object-for-object-of-depth-1', () => {4 const obj = { a: 1 }5 const frozenObj = deepFreeze(obj)6 expect(obj).not.toBe(frozenObj)7 expect(obj.a).toBe(frozenObj.a)8 })9 it('freezes-the-object-of-depth-1', () => {10 const obj = { a: 1 }11 const frozenObj = deepFreeze(obj)12 const mutation = () => (frozenObj.a = 2)13 expect(mutation).toThrow(TypeError)14 expect(mutation).toThrowError(ERRORS.READ_ONLY('a'))15 })16 it('makes-the-object-non-extensible', () => {17 const obj = { a: 1 }18 const frozenObj = deepFreeze(obj)19 const insertion = () => (frozenObj.b = 1)20 expect(insertion).toThrow(TypeError)21 expect(insertion).toThrowError(ERRORS.CANT_ADD_PROP('b'))22 })23 it('makes-the-properties-non-deletable', () => {24 const obj = { a: 1 }25 const frozenObj = deepFreeze(obj)26 const del = () => delete frozenObj.a27 expect(del).toThrow(TypeError)28 expect(del).toThrowError(ERRORS.CANT_DEL_PROP('a'))29 })30 it('does-not-perform-inplace-deep-freeze-by-default', () => {31 const obj = { a: 1 }32 deepFreeze(obj)33 const mutation = () => (obj.a = 2)34 expect(mutation).not.toThrow(TypeError)35 expect(mutation).not.toThrowError(ERRORS.READ_ONLY('a'))36 })37 it('does-not-make-an-object-non-extensible-inplace-by-default', () => {38 const insertion = () => (obj.b = 1)39 expect(insertion).not.toThrow(TypeError)40 expect(insertion).not.toThrowError(ERRORS.CANT_ADD_PROP('b'))41 })42 it('returns-the-same-object-when-inplace-argument-is-true', () => {43 const obj = { a: 1 }44 const frozenObj = deepFreeze(obj, true)45 expect(obj).toBe(frozenObj)46 })47 it('makes-the-properties-non-deletable-inplace', () => {48 const obj = { a: 1 }49 deepFreeze(obj, true)50 const del = () => delete obj.a51 expect(del).toThrow(TypeError)52 expect(del).toThrowError(ERRORS.CANT_DEL_PROP('a'))53 })54 it('freezes-the-object-inplace-if-inplace-argument-is-true', () => {55 const obj = { a: 1 }56 deepFreeze(obj, true)57 const mutation = () => (obj.a = 2)58 expect(mutation).toThrow(TypeError)59 expect(mutation).toThrowError(ERRORS.READ_ONLY('a'))60 })61 it('freezes-the-object-inplace-if-inplace-argument-is-true', () => {62 const obj = { a: 1 }63 deepFreeze(obj, true)64 const mutation = () => (obj.b = 2)65 expect(mutation).toThrow(TypeError)66 expect(mutation).toThrowError(ERRORS.CANT_ADD_PROP('b'))67 })68 it('returns-a-cloned-object-for-object-of-depth-greater-than-1', () => {69 const obj = { a: { b: 1, c: { d: 1 } } }70 const frozenObj = deepFreeze(obj)71 expect(obj).not.toBe(frozenObj)72 expect(obj.a.b).toBe(frozenObj.a.b)73 expect(obj.a.c.d).toBe(frozenObj.a.c.d)74 })75 it('freezes-the-passed-object-of-depth-greater-than-1', () => {76 const obj = { a: { b: 1, c: { d: 1 } } }77 const frozenObj = deepFreeze(obj)78 // depth 279 const mutateDepth2 = () => (frozenObj.a.b = 2)80 expect(mutateDepth2).toThrow(TypeError)81 expect(mutateDepth2).toThrowError(ERRORS.READ_ONLY('b'))82 const mutateDepth2_2 = () => (frozenObj.a.c = 1)83 expect(mutateDepth2_2).toThrow(TypeError)84 expect(mutateDepth2_2).toThrowError(ERRORS.READ_ONLY('c'))85 // depth 386 const mutateDepth3 = () => (frozenObj.a.c.d = 2)87 expect(mutateDepth3).toThrow(TypeError)88 expect(mutateDepth3).toThrowError(ERRORS.READ_ONLY('d'))89 })90 it('makes-the-passed-object-of-depth-greater-than-1-non-extensible', () => {91 const obj = { a: { b: 1, c: { d: 1 } } }92 const frozenObj = deepFreeze(obj)93 // depth 294 const mutateDepth2 = () => (frozenObj.a.a = 2)95 expect(mutateDepth2).toThrow(TypeError)96 expect(mutateDepth2).toThrowError(ERRORS.CANT_ADD_PROP('a'))97 // depth 398 const mutateDepth3 = () => (frozenObj.a.c.a = 2)99 expect(mutateDepth3).toThrow(TypeError)100 expect(mutateDepth3).toThrowError(ERRORS.CANT_ADD_PROP('a'))101 })102})103describe('deepFreeze:array', () => {104 it('freezes-the-array', () => {105 const arr = [0, 1, 2]106 const frozen = deepFreeze(arr)107 const mutate = () => (frozen[0] = 1)108 expect(mutate).toThrow(TypeError)109 expect(mutate).toThrowError(ERRORS.READ_ONLY('0', '[object Array]'))110 })111 it('makes-the-array-non-extensible', () => {112 const arr = [0, 1, 2]113 const frozen = deepFreeze(arr)114 console.log(frozen)115 const mutate = () => frozen.push(1)116 expect(mutate).toThrow(TypeError)117 expect(mutate).toThrowError(ERRORS.CANT_ADD_PROP('3'))118 })119 it('freezes-the-array-inplace', () => {120 const frozen = deepFreeze([0, 1, 2], true)121 const mutate = () => (frozen[0] = 1)122 expect(mutate).toThrow(TypeError)123 expect(mutate).toThrowError(ERRORS.READ_ONLY('0', '[object Array]'))124 })125 it('freezes-the-indexes-in-the-array-of-objects', () => {126 const arr = [{ a: 1 }]127 const frozen = deepFreeze(arr)128 let mutate = () => (frozen[0] = 1)129 expect(mutate).toThrow(TypeError)130 expect(mutate).toThrowError(ERRORS.READ_ONLY('0', '[object Array]'))131 mutate = () => (frozen[0].a = 1)132 expect(mutate).toThrow(TypeError)133 expect(mutate).toThrowError(ERRORS.READ_ONLY('a'))134 })135 it('freezes-the-indexes-in-the-array-of-objects-inplace', () => {136 const frozen = deepFreeze([{ a: 1 }], true)137 let mutate = () => (frozen[0] = 1)138 expect(mutate).toThrow(TypeError)139 expect(mutate).toThrowError(ERRORS.READ_ONLY('0', '[object Array]'))140 mutate = () => (frozen[0].a = 1)141 expect(mutate).toThrow(TypeError)142 expect(mutate).toThrowError(ERRORS.READ_ONLY('a'))143 })144 it('deep-freezes-the-indexes-in-the-array-of-objects', () => {145 const arr = [{ b: { c: 2, d: [3, { e: 4 }] } }]146 const frozen = deepFreeze(arr)147 let mutate = () => (frozen[0].b.c = 5)148 expect(mutate).toThrow(TypeError)149 expect(mutate).toThrowError(ERRORS.READ_ONLY('c'))150 mutate = () => (frozen[0].b.d = 5)151 expect(mutate).toThrow(TypeError)152 expect(mutate).toThrowError(ERRORS.READ_ONLY('d'))153 mutate = () => (frozen[0].b.d[0] = 5)154 expect(mutate).toThrow(TypeError)155 expect(mutate).toThrowError(ERRORS.READ_ONLY('0', '[object Array]'))156 mutate = () => (frozen[0].b.d[1] = 5)157 expect(mutate).toThrow(TypeError)158 expect(mutate).toThrowError(ERRORS.READ_ONLY('1', '[object Array]'))159 mutate = () => (frozen[0].b.d[1].e = 5)160 expect(mutate).toThrow(TypeError)161 expect(mutate).toThrowError(ERRORS.READ_ONLY('e'))162 })163 it('deep-freezes-the-indexes-in-the-array-of-objects-inplace', () => {164 const frozen = deepFreeze([{ b: { c: 2, d: [3, { e: 4 }] } }])165 let mutate = () => (frozen[0].b.c = 5)166 expect(mutate).toThrow(TypeError)167 expect(mutate).toThrowError(ERRORS.READ_ONLY('c'))168 mutate = () => (frozen[0].b.d = 5)169 expect(mutate).toThrow(TypeError)170 expect(mutate).toThrowError(ERRORS.READ_ONLY('d'))171 mutate = () => (frozen[0].b.d[0] = 5)172 expect(mutate).toThrow(TypeError)173 expect(mutate).toThrowError(ERRORS.READ_ONLY('0', '[object Array]'))174 mutate = () => (frozen[0].b.d[1] = 5)175 expect(mutate).toThrow(TypeError)176 expect(mutate).toThrowError(ERRORS.READ_ONLY('1', '[object Array]'))177 mutate = () => (frozen[0].b.d[1].e = 5)178 expect(mutate).toThrow(TypeError)179 expect(mutate).toThrowError(ERRORS.READ_ONLY('e'))180 })181})182describe('deepFreeze:prototype', () => {183 it('freezes-prototype-object', () => {184 const a = { a: 1 }185 const frozen = deepFreeze(a)186 const mutate = () => (frozen.__proto__ = { c: 2 })187 expect(mutate).toThrow(TypeError)188 expect(mutate).toThrowError(ERRORS.NOT_EXTENSIBLE())189 })190 it('makes-prototype-object-non-extensible', () => {191 const a = { a: 1 }192 const frozen = deepFreeze(a)193 const mutate = () => (frozen.__proto__.b = { c: 2 })194 expect(mutate).toThrow(TypeError)195 expect(mutate).toThrowError(ERRORS.CANT_ADD_PROP('b'))196 })197})198const ERRORS = {199 READ_ONLY: (prop, obj = '#<Object>') =>200 `Cannot assign to read only property '${prop}' of object '${obj}'`,201 CANT_ADD_PROP: prop =>202 `Cannot add property ${prop}, object is not extensible`,203 NOT_EXTENSIBLE: (obj = '#<Object>') => `${obj} is not extensible`,204 CANT_DEL_PROP: (prop, obj = '#<Object>') =>205 `Cannot delete property '${prop}' of ${obj}`...

Full Screen

Full Screen

examples.js

Source:examples.js Github

copy

Full Screen

1import tinycolor from 'tinycolor2'2import { mutateTranslate, mutateRandomizeAnchors, mutateRandomness, mutateRandomizeConnectors, mutateConnectEnds, mutateMatchStart, mutateMatchEnd, mutateShortern, mutateMoveEnd, mutateTaperOff } from './path-mutators'3import { getLerpedPath } from './util'4import { createPath } from './path-creator'5// Warning, this file will likely stay messy. It's art baby!6export default function Examples (controls, renderLoop, addPathToScene, removePathsFromScene, addDebugToScene) {7 return {8 simple: () => {9 const path = createPath(controls)10 addPathToScene(path, '#FF9D99')11 addDebugToScene(path)12 },13 color: () => {14 const path = mutateConnectEnds(createPath(controls))15 addPathToScene(path, '#FF9D99')16 addDebugToScene(path)17 addPathToScene(mutateRandomness(path, 128), '#A8F6FF')18 addPathToScene(mutateRandomness(path, 128), '#A5D0FF')19 addPathToScene(mutateRandomness(path, 128), '#A3A8FF')20 addPathToScene(mutateRandomness(path, 128), '#C3A1FF')21 },22 lerp: () => {23 let step = 024 const randomness = 6425 function preparePaths () {26 const basePath = mutateConnectEnds(createPath(controls))27 const paths = []28 paths.push(mutateConnectEnds(mutateRandomness(basePath, randomness)))29 paths.push(mutateConnectEnds(mutateRandomness(basePath, randomness)))30 paths.push(mutateConnectEnds(mutateRandomness(basePath, randomness)))31 paths.push(mutateConnectEnds(mutateRandomness(basePath, randomness)))32 return paths33 }34 let fromPaths = preparePaths()35 let toPaths = preparePaths()36 renderLoop.push(() => {37 if (step < 1) {38 removePathsFromScene()39 addPathToScene(getLerpedPath(fromPaths[0], toPaths[0], step), '#A8F6FF')40 addPathToScene(getLerpedPath(fromPaths[1], toPaths[1], step), '#A5D0FF')41 addPathToScene(getLerpedPath(fromPaths[2], toPaths[2], step), '#A3A8FF')42 addPathToScene(getLerpedPath(fromPaths[3], toPaths[3], step), '#C3A1FF')43 step = step + 0.02544 } else {45 fromPaths = toPaths46 toPaths = preparePaths()47 step = 048 }49 })50 },51 threeConsistentLines: () => {52 const path1 = createPath(controls)53 addDebugToScene(path1)54 const path2 = mutateMatchEnd(mutateMatchStart(mutateRandomness(path1, 64), path1), path1)55 const path3 = mutateMatchEnd(mutateMatchStart(mutateRandomness(path1, 64), path1), path1)56 addPathToScene(path1, '#FF9D99')57 addPathToScene(path2, '#A8F6FF')58 addPathToScene(path3, '#A5D0FF')59 },60 linesTaperOff: () => {61 const path = createPath(controls)62 const first = mutateRandomness(path, 32)63 const second = mutateTaperOff(mutateMoveEnd(mutateShortern(mutateRandomness(path, 32), 0)))64 const third = mutateTaperOff(mutateMoveEnd(mutateShortern(mutateRandomness(path, 32), 1)))65 addPathToScene(first, '#FF9D99')66 addPathToScene(second, '#A8F6FF')67 addPathToScene(third, '#A5D0FF')68 },69 lerpAdd: () => {70 let step = 071 const randomness = 6472 function preparePaths () {73 const basePath = mutateConnectEnds(createPath(controls))74 const paths = []75 paths.push(mutateConnectEnds(mutateRandomness(basePath, randomness)))76 paths.push(mutateConnectEnds(mutateRandomness(basePath, randomness)))77 paths.push(mutateConnectEnds(mutateRandomness(basePath, randomness)))78 paths.push(mutateConnectEnds(mutateRandomness(basePath, randomness)))79 return paths80 }81 let fromPaths = preparePaths()82 let toPaths = preparePaths()83 let baseColor = tinycolor('#A8F6FF').spin(Math.random() * 360)84 renderLoop.push(() => {85 if (step < 1) {86 addPathToScene(getLerpedPath(fromPaths[0], toPaths[0], step), baseColor.toString())87 addPathToScene(getLerpedPath(fromPaths[1], toPaths[1], step), tinycolor(baseColor.toString()).spin(20 + step * 90).toString())88 addPathToScene(getLerpedPath(fromPaths[2], toPaths[2], step), tinycolor(baseColor.toString()).spin(40 + step * 90).toString())89 addPathToScene(getLerpedPath(fromPaths[3], toPaths[3], step), tinycolor(baseColor.toString()).spin(60 + step * 90).toString())90 step = step + 0.0191 } else {92 removePathsFromScene()93 baseColor = tinycolor('#A8F6FF').spin(Math.random() * 360)94 fromPaths = toPaths95 const basePath = mutateConnectEnds(createPath(controls))96 toPaths = []97 toPaths.push(mutateConnectEnds(mutateRandomness(basePath, randomness)))98 toPaths.push(mutateConnectEnds(mutateRandomness(basePath, randomness)))99 toPaths.push(mutateConnectEnds(mutateRandomness(basePath, randomness)))100 toPaths.push(mutateConnectEnds(mutateRandomness(basePath, randomness)))101 step = 0102 }103 })104 }105 }...

Full Screen

Full Screen

MutateInputs.js

Source:MutateInputs.js Github

copy

Full Screen

1import React, { useState } from "react";2import Box from "@material-ui/core/Box";3export const defalutMutateInput = {4 mutateProp: 0.5,5 mutateNotesConst: [60, 62, 66],6};7export function MutateInputs(props) {8 const [mutateProp, setMutateProp] = useState(0.5);9 const [mutateNotesConst, setMutateNotesConst] = useState("60 62 66");10 const MutatePropability = (11 <div>12 <label>Mutate propability{""}</label>13 <input14 type="number"15 onChange={(e) => setMutateProp(Number(e.target.value))}16 />{" "}17 </div>18 );19 function handleClickSet() {20 let notes = [];21 let ok = true;22 let index = 0;23 if (mutateNotesConst.length > 0) {24 while (ok) {25 let num = Number(mutateNotesConst[index] + mutateNotesConst[index + 1]);26 index = index + 3;27 notes.push(num);28 if (index >= mutateNotesConst.length - 1) ok = false;29 }30 }31 props.setMutateInput({32 mutateProp: mutateProp,33 mutateNotesConst: notes,34 });35 }36 const MutateNotes = (37 <div>38 <label>Mutate Notes{""}</label>39 <input onChange={(e) => setMutateNotesConst(e.target.value)} />{" "}40 </div>41 );42 return (43 <div>44 <h5>Mutate</h5>45 <Box>46 {MutatePropability}47 {MutateNotes}48 </Box>49 <button onClick={handleClickSet}>Set</button>50 </div>51 );...

Full Screen

Full Screen

Using AI Code Generation

copy

Full Screen

1var mutate = require('stryker-parent').mutate;2var a = 1;3var b = 2;4var c = 3;5var d = 4;6var e = 5;7var f = 6;8var g = 7;9var h = 8;10var i = 9;11var j = 10;12var k = 11;13var l = 12;14var m = 13;15var n = 14;16var o = 15;17var p = 16;18var q = 17;19var r = 18;20var s = 19;21var t = 20;22var u = 21;23var v = 22;24var w = 23;25var x = 24;26var y = 25;27var z = 26;28var a1 = 27;29var b1 = 28;30var c1 = 29;31var d1 = 30;32var e1 = 31;33var f1 = 32;34var g1 = 33;35var h1 = 34;36var i1 = 35;37var j1 = 36;38var k1 = 37;39var l1 = 38;40var m1 = 39;41var n1 = 40;42var o1 = 41;43var p1 = 42;44var q1 = 43;45var r1 = 44;46var s1 = 45;47var t1 = 46;48var u1 = 47;49var v1 = 48;50var w1 = 49;51var x1 = 50;52var y1 = 51;53var z1 = 52;54var a2 = 53;55var b2 = 54;56var c2 = 55;57var d2 = 56;58var e2 = 57;59var f2 = 58;60var g2 = 59;61var h2 = 60;62var i2 = 61;63var j2 = 62;64var k2 = 63;65var l2 = 64;66var m2 = 65;67var n2 = 66;68var o2 = 67;69var p2 = 68;70var q2 = 69;71var r2 = 70;72var s2 = 71;73var t2 = 72;74var u2 = 73;

Full Screen

Using AI Code Generation

copy

Full Screen

1var strykerParent = require('stryker-parent');2var strykerParentMutate = strykerParent.mutate;3var strykerParentMutate = strykerParent.mutate;4strykerParentMutate('test.js', 'console.log("hello world")', function (err, result) {5 if (err) {6 console.log('Error: ', err);7 } else {8 console.log('Result: ', result);9 }10});11var strykerParent = require('stryker-parent');12var strykerParentMutate = strykerParent.mutate;13strykerParentMutate('test.js', 'console.log("hello world")', function (err, result) {14 if (err) {15 console.log('Error: ', err);16 } else {17 console.log('Result: ', result);18 }19});20var strykerParent = require('stryker-parent');21var strykerParentMutate = strykerParent.mutate;22strykerParentMutate('test.js', 'console.log("hello world")', function (err, result) {23 if (err) {24 console.log('Error: ', err);25 } else {26 console.log('Result: ', result);27 }28});29var strykerParent = require('stryker-parent');30var strykerParentMutate = strykerParent.mutate;31strykerParentMutate('test.js', 'console.log("hello world")', function (err, result) {32 if (err) {33 console.log('Error: ', err);34 } else {35 console.log('Result: ', result);36 }37});38var strykerParent = require('stryker-parent');39var strykerParentMutate = strykerParent.mutate;40strykerParentMutate('test.js', 'console.log("hello world")', function (err, result) {41 if (err) {42 console.log('Error: ', err);43 } else {44 console.log('Result: ', result

Full Screen

Using AI Code Generation

copy

Full Screen

1const mutate = require('stryker-parent').mutate;2mutate('test.js', 'mutated.js', 'javascript', { plugins: ['stryker-javascript-mutator'] }).then(() => {3 console.log('Mutation done');4});5const mutate = require('stryker-parent').mutate;6mutate('test.ts', 'mutated.ts', 'typescript', { plugins: ['stryker-typescript'] }).then(() => {7 console.log('Mutation done');8});9const mutate = require('stryker-parent').mutate;10mutate('test.js', 'mutated.js', 'javascript', { plugins: ['stryker-javascript-mutator'] }).then(() => {11 console.log('Mutation done');12});13const mutate = require('stryker-parent').mutate;14mutate('test.ts', 'mutated.ts', 'typescript', { plugins: ['stryker-typescript'] }).then(() => {15 console.log('Mutation done');16});17const mutate = require('stryker-parent').mutate;18mutate('test.js', 'mutated.js', 'javascript', { plugins: ['stryker-javascript-mutator'] }).then(() => {19 console.log('Mutation done');20});21const mutate = require('stryker-parent').mutate;22mutate('test.ts', 'mutated.ts', 'typescript', { plugins: ['stryker-typescript'] }).then(() => {23 console.log('Mutation done');24});25const mutate = require('stryker-parent').mutate;26mutate('test.js', 'mutated.js', 'javascript', { plugins: ['stryker-javascript-mutator'] }).then(() => {27 console.log('Mutation done');28});29const mutate = require('stryker-parent').mutate;30mutate('test.ts', 'mutated.ts', 'typescript

Full Screen

Using AI Code Generation

copy

Full Screen

1var mutate = require('stryker-parent').mutate;2var code = "var x = 1;";3var mutants = mutate(code);4var mutate = require('./lib/mutate');5module.exports = {6};7var mutate = require('stryker-parent').mutate;8var code = "var x = 1;";9var mutants = mutate(code);

Full Screen

Using AI Code Generation

copy

Full Screen

1var esprima = require('esprima');2var estraverse = require('estraverse');3var escodegen = require('escodegen');4var fs = require('fs');5var code = fs.readFileSync('test1.js', 'utf-8');6var ast = esprima.parse(code, {range: true, loc: true});7var mutants = [];8var mutantId = 0;9estraverse.traverse(ast, {10 enter: function(node, parent) {11 if (node.type === 'BinaryExpression') {12 var mutant = escodegen.generate(mutate(node, parent));13 mutants.push(mutant);14 console.log(mutant);15 }16 }17});18function mutate(node, parent) {19 if (node.operator === '+') {20 return createMutant(node, parent, '-');21 }22 if (node.operator === '-') {23 return createMutant(node, parent, '+');24 }25 if (node.operator === '*') {26 return createMutant(node, parent, '/');27 }28 if (node.operator === '/') {29 return createMutant(node, parent, '*');30 }31 if (node.operator === '<') {32 return createMutant(node, parent, '>');33 }34 if (node.operator === '>') {35 return createMutant(node, parent, '<');36 }37 if (node.operator === '<=') {38 return createMutant(node, parent, '>=');39 }40 if (node.operator === '>=') {41 return createMutant(node, parent, '<=');42 }43 if (node.operator === '==') {44 return createMutant(node, parent, '===');45 }46 if (node.operator === '===') {47 return createMutant(node, parent, '==');48 }49 if (node.operator === '!=') {50 return createMutant(node, parent, '!==');51 }52 if (node.operator === '!==') {53 return createMutant(node, parent, '!=');54 }55}56function createMutant(node, parent, operator) {57 var newMutant = {58 };59 if (parent.type === 'BinaryExpression') {60 if (parent.left === node) {

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 stryker-parent 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