risei 1.3.4 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +142 -379
- package/Read-me reduced.md +294 -0
- package/Read-me redux.md +581 -0
- package/index.js +5 -5
- package/package.json +10 -11
- package/system/ASpoofingFixture.js +7 -8
- package/system/ATestCaller.js +3 -3
- package/system/ATestFinder.js +2 -2
- package/system/ATestReporter.js +2 -1
- package/system/ATestSource.js +5 -1
- package/system/ChosenTestFinder.js +4 -4
- package/system/ClassTestGroup.js +2 -2
- package/system/LocalCaller.js +5 -5
- package/system/{ClassMethodSpoofer.js → MethodSpoofer.js} +54 -48
- package/system/MethodTestGroup.js +2 -2
- package/system/Moment.js +1 -1
- package/system/NameAnalyzer.js +26 -0
- package/system/PropertySpoofer.js +156 -0
- package/system/Risei.js +5 -5
- package/system/SpoofDef.js +260 -0
- package/system/TerminalReporter.js +8 -8
- package/system/{TestDefinition.js → TestDef.js} +153 -107
- package/system/TestFinder.js +3 -3
- package/system/TestFrame.js +15 -52
- package/system/TestGroup.js +1 -1
- package/system/TestResult.js +2 -2
- package/system/TestRunner.js +23 -107
- package/system/TestStages.js +80 -76
- package/system/TestSummary.js +1 -1
- package/system/TotalComparer.js +60 -11
- package/system/TotalDisplayer.js +33 -12
- package/system/TypeAnalyzer.js +41 -79
- package/system/TypeIdentifier.js +18 -8
- package/system/Types.js +3 -1
- package/test-target-objects/ConditionalThrowTarget.js +11 -0
- package/test-target-objects/Counter.js +46 -0
- package/test-target-objects/DomTarget.js +37 -0
- package/test-target-objects/InterSpoofer.js +230 -0
- package/test-target-objects/MixedContents.js +33 -0
- package/test-target-objects/MutationTarget.js +37 -0
- package/test-target-objects/ObjectComposer.js +34 -0
- package/test-target-objects/PolySpoofableInner.js +29 -0
- package/test-target-objects/PolySpoofableOuter.js +52 -0
- package/test-target-objects/PropertiesTarget.js +98 -0
- package/test-target-objects/Returner.js +7 -0
- package/test-target-objects/Searcher.js +25 -0
- package/test-target-objects/Sorter.js +91 -0
- package/test-target-objects/Spoofable.js +36 -0
- package/test-target-objects/StateTarget.js +34 -0
- package/test-target-objects/StaticTarget.js +17 -0
- package/test-target-objects/TestableTarget.js +57 -0
- package/trial-tests/SelfTests.outward-rt.js +511 -0
- package/trial-tests/TopicTests.outward-rt.js +313 -0
- package/usage-examples/Gold-bar-example.png +0 -0
- package/usage-examples/Title-example.png +0 -0
- package/xternal-tests/ASpoofingFixture.tests.js +242 -0
- package/xternal-tests/MethodSpoofer.tests.js +130 -0
- package/xternal-tests/SpoofDef.tests.js +91 -0
- package/xternal-tests/TotalComparer.tests.js +1055 -0
- package/xternal-tests/package.json +7 -0
- package/system/AComparer.js +0 -9
- package/system/ATestFixture.js +0 -44
- package/system/ClassPropertySpoofer.js +0 -185
- package/system/ObjectMethodSpoofer.js +0 -58
- package/system/ObjectPropertySpoofer.js +0 -136
- package/system/SpoofDefinition.js +0 -243
- package/system/TestFrameChooser.js +0 -54
- package/system/TestFrames.js +0 -232
- package/system/TotalCopier.js +0 -106
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**/
|
|
2
|
+
|
|
3
|
+
import PolySpoofableInner from "./PolySpoofableInner.js";
|
|
4
|
+
|
|
5
|
+
export default class PolySpoofableOuter {
|
|
6
|
+
/* Spoofing target. */
|
|
7
|
+
#inner;
|
|
8
|
+
|
|
9
|
+
constructor() {
|
|
10
|
+
this.#inner = new PolySpoofableInner();
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/* Not intended to be spoofed, but to use spoofs. */
|
|
14
|
+
combinedNumbers(numbers) {
|
|
15
|
+
let first = this.#inner.addOrTimes(numbers);
|
|
16
|
+
let second = this.#inner.minusOrOver(numbers);
|
|
17
|
+
|
|
18
|
+
let combined = this.combiner(first, second);
|
|
19
|
+
return combined;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/* Spoofing target. */
|
|
23
|
+
combiner(first, second) {
|
|
24
|
+
let combined = Math.pow(first, second);
|
|
25
|
+
return combined;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/* Not intended to be spoofed, but to use spoofs. */
|
|
29
|
+
combinedPlusHosted(numbers) {
|
|
30
|
+
let combined = this.combinedNumbers(numbers);
|
|
31
|
+
let third = this.#inner.numberHost.supplyC();
|
|
32
|
+
let fourth = this.#inner.numberHost.supplyD();
|
|
33
|
+
|
|
34
|
+
return combined + third - fourth;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/* Not intended to be spoofed, but to use arg with spoofs. */
|
|
38
|
+
combinedArgAAndB(inner) {
|
|
39
|
+
let first = inner.supplyA();
|
|
40
|
+
let second = inner.supplyB();
|
|
41
|
+
|
|
42
|
+
return first + second;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/* Not intended to be spoofed, but to use arg with spoofs. */
|
|
46
|
+
combinedArgHostedCAndD(inner) {
|
|
47
|
+
let third = inner.numberHost.supplyC();
|
|
48
|
+
let fourth = inner.numberHost.supplyD();
|
|
49
|
+
|
|
50
|
+
return third - fourth;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**/
|
|
2
|
+
|
|
3
|
+
/* Rarely or never directly addressed elsewhere. */
|
|
4
|
+
export class PropertyBase {
|
|
5
|
+
// region Static members
|
|
6
|
+
|
|
7
|
+
static staticBaseValueProp = 5;
|
|
8
|
+
|
|
9
|
+
// region .staticBaseAccessorProp
|
|
10
|
+
|
|
11
|
+
static #staticAccessedField = "6th";
|
|
12
|
+
|
|
13
|
+
static get staticBaseAccessorProp() {
|
|
14
|
+
return PropertyBase.#staticAccessedField;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
static set staticBaseAccessorProp(value) {
|
|
18
|
+
PropertyBase.#staticAccessedField = value;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// endregion .staticBaseAccessorProp
|
|
22
|
+
|
|
23
|
+
static staticBaseMethod() {
|
|
24
|
+
return "base static";
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// endregion Static members
|
|
28
|
+
|
|
29
|
+
// region Instance members
|
|
30
|
+
|
|
31
|
+
instanceBaseValueProp = 7;
|
|
32
|
+
|
|
33
|
+
// region .instanceBaseAccessorProp
|
|
34
|
+
|
|
35
|
+
#instanceAccessedProp = "8th";
|
|
36
|
+
|
|
37
|
+
get instanceBaseAccessorProp() {
|
|
38
|
+
return this.#instanceAccessedProp;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
set instanceBaseAccessorProp(value) {
|
|
42
|
+
this.#instanceAccessedProp = value;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// endregion .instanceBaseAccessorProp
|
|
46
|
+
|
|
47
|
+
instanceBaseMethod() {
|
|
48
|
+
return "base instance";
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// endregion Instance members
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export default class PropertiesTarget extends PropertyBase {
|
|
55
|
+
// region Static members
|
|
56
|
+
|
|
57
|
+
static staticValueProp = 3;
|
|
58
|
+
|
|
59
|
+
// region .staticAccessorProp
|
|
60
|
+
|
|
61
|
+
static #staticAccessorValue = "4th";
|
|
62
|
+
|
|
63
|
+
static get staticAccessorProp() {
|
|
64
|
+
return this.#staticAccessorValue;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
static set staticAccessorProp(value) {
|
|
68
|
+
this.#staticAccessorValue = value;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// endregion .staticAccessorProp
|
|
72
|
+
|
|
73
|
+
static staticMethod() {
|
|
74
|
+
return "static";
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// endregion Static members
|
|
78
|
+
|
|
79
|
+
// region Instance members
|
|
80
|
+
|
|
81
|
+
valueProp = 1;
|
|
82
|
+
|
|
83
|
+
#accessorValue = "2nd";
|
|
84
|
+
|
|
85
|
+
get accessorProp() {
|
|
86
|
+
return this.#accessorValue;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
set accessorProp(value) {
|
|
90
|
+
this.#accessorValue = value;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
instanceMethod() {
|
|
94
|
+
return "instance";
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// endregion Instance members
|
|
98
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**/
|
|
2
|
+
|
|
3
|
+
export default class Searcher {
|
|
4
|
+
constructor() {
|
|
5
|
+
/* No operations.*/
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
findLinear(sought, subject) /* passed */ {
|
|
9
|
+
// Fail path. All edge cases return false.
|
|
10
|
+
if (subject === undefined) {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// Main path.
|
|
15
|
+
for (let item of subject) {
|
|
16
|
+
if (item === sought) {
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// Never found.
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**/
|
|
2
|
+
|
|
3
|
+
export default class Sorter {
|
|
4
|
+
constructor() {
|
|
5
|
+
/* No operations. */
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
countSort(subject) /* passed */ {
|
|
9
|
+
// To store indices for sorting to.
|
|
10
|
+
let sites = subject
|
|
11
|
+
.map(x => 0);
|
|
12
|
+
|
|
13
|
+
// Finding positions.
|
|
14
|
+
for (let at = 0; at < subject.length; at++) {
|
|
15
|
+
for (let on = 0; on < subject.length; on++) {
|
|
16
|
+
if (subject[on] < subject[at]) {
|
|
17
|
+
sites[at]++;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// To retain reordered items.
|
|
23
|
+
let output = sites
|
|
24
|
+
.map(x => 0);
|
|
25
|
+
|
|
26
|
+
// Placing into output positions.
|
|
27
|
+
for (let at = 0; at < sites.length; at++) {
|
|
28
|
+
let to = sites[at];
|
|
29
|
+
output[to] = subject[at];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Back to caller.
|
|
33
|
+
return output;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
mergeSort(subject) /* passed */ {
|
|
37
|
+
return this.#mergeRecursor(subject);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// region Private dependencies of mergeSort()
|
|
41
|
+
|
|
42
|
+
#mergeRecursor(subject, level) /* verified */ {
|
|
43
|
+
// Can't split for further merging.
|
|
44
|
+
if (subject.length === 1) {
|
|
45
|
+
return subject;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Splitting for recursing at next level.
|
|
49
|
+
let { left, right } = this.#splitInHalf(subject);
|
|
50
|
+
|
|
51
|
+
// Actual recursion, calling next level directly.
|
|
52
|
+
let lefts = this.#mergeRecursor(left);
|
|
53
|
+
let rights = this.#mergeRecursor(right);
|
|
54
|
+
|
|
55
|
+
// Actually merging, then back to caller.
|
|
56
|
+
let merged = this.#merge(lefts, rights);
|
|
57
|
+
return merged;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
#splitInHalf(subject) /* verified */ {
|
|
61
|
+
// These slicing args ensure no lost items.
|
|
62
|
+
let left = subject.slice(0, subject.length / 2);
|
|
63
|
+
let right = subject.slice(left.length, subject.length);
|
|
64
|
+
|
|
65
|
+
return { left, right };
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
#merge(lefts, rights) /* verified */ {
|
|
69
|
+
// To hold output.
|
|
70
|
+
let merged = [];
|
|
71
|
+
|
|
72
|
+
// While both sides have items, pop the lowest
|
|
73
|
+
// of the two at the top to the output.
|
|
74
|
+
while (lefts.length > 0 && rights.length > 0) {
|
|
75
|
+
let side = lefts[0] < rights[0] ? lefts : rights;
|
|
76
|
+
let next = side.shift();
|
|
77
|
+
|
|
78
|
+
merged.push(next);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// When one side is done, pop the rest of the other.
|
|
82
|
+
let surplus = lefts.length > rights.length ? lefts : rights;
|
|
83
|
+
merged.push(...surplus);
|
|
84
|
+
|
|
85
|
+
// Back to caller.
|
|
86
|
+
return merged;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// endregion Private dependencies of mergeSort()
|
|
90
|
+
|
|
91
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**/
|
|
2
|
+
|
|
3
|
+
export default class Spoofable {
|
|
4
|
+
#member;
|
|
5
|
+
|
|
6
|
+
constructor(member) {
|
|
7
|
+
/* Optional member to test spoofing with SOF. */
|
|
8
|
+
if (member) {
|
|
9
|
+
this.#member = member;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/* Member to test spoofing with SCF. */
|
|
14
|
+
spoofNumber(a, b) { return a + b; }
|
|
15
|
+
|
|
16
|
+
/* Member to test spoofing with SCF.
|
|
17
|
+
* Enables testing of spoofNumber() spoofing that
|
|
18
|
+
* returns no value (the spoofed method is empty). */
|
|
19
|
+
callSpoofNumber(a, b) {
|
|
20
|
+
let result = this.spoofNumber(a, b);
|
|
21
|
+
|
|
22
|
+
if (result === undefined) {
|
|
23
|
+
return "spoofNumber() internal call: no return value";
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/* Member to test spoofing with SCF. */
|
|
30
|
+
spoofText(t, u) { return `Texts "${ t }" and "${ u }".`; }
|
|
31
|
+
|
|
32
|
+
/* Member to test spoofing with SOF. */
|
|
33
|
+
callMemberMethod() {
|
|
34
|
+
return member.something();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**/
|
|
2
|
+
|
|
3
|
+
export default class StateTarget {
|
|
4
|
+
#numberState;
|
|
5
|
+
#textState;
|
|
6
|
+
|
|
7
|
+
get numberState() {
|
|
8
|
+
return this.#numberState;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
get textState() {
|
|
12
|
+
return this.#textState;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
constructor() {
|
|
16
|
+
this.#numberState = 1;
|
|
17
|
+
this.#textState = "1";
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
setNumberState(number) {
|
|
21
|
+
this.#numberState = number;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
setTextState(text) {
|
|
25
|
+
this.#textState = text;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
changeNumberAndTextState(number, text) {
|
|
29
|
+
this.#numberState = number;
|
|
30
|
+
this.#textState = text;
|
|
31
|
+
|
|
32
|
+
return { number: this.#numberState, text: this.#textState };
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**/
|
|
2
|
+
|
|
3
|
+
export default class StaticTarget {
|
|
4
|
+
static #property = "default-static-property";
|
|
5
|
+
|
|
6
|
+
static get staticProperty() {
|
|
7
|
+
return StaticTarget.#property;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
static setStaticProperty(value) {
|
|
11
|
+
StaticTarget.#property = value;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
static multiplyThenDivide(a, b, c) {
|
|
15
|
+
return (a * b) / c;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**/
|
|
2
|
+
|
|
3
|
+
export default class TestableTarget {
|
|
4
|
+
// region Static members
|
|
5
|
+
|
|
6
|
+
static staticValueProp = 3;
|
|
7
|
+
|
|
8
|
+
static #staticAccessorValue = "4th";
|
|
9
|
+
|
|
10
|
+
static get staticAccessorProp() {
|
|
11
|
+
return this.#staticAccessorValue;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
static set staticAccessorProp(value) {
|
|
15
|
+
this.#staticAccessorValue = value;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
static staticMethod() {
|
|
19
|
+
return "static";
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
static staticThrower() {
|
|
23
|
+
// You don't have to throw an Error object.
|
|
24
|
+
throw "Throw by staticThrower().";
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// endregion Static members
|
|
28
|
+
|
|
29
|
+
constructor() {
|
|
30
|
+
/* No operations. */
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// region Instance members
|
|
34
|
+
|
|
35
|
+
valueProp = 1;
|
|
36
|
+
|
|
37
|
+
#accessorValue = "2nd";
|
|
38
|
+
|
|
39
|
+
get accessorProp() {
|
|
40
|
+
return this.#accessorValue;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
set accessorProp(value) {
|
|
44
|
+
this.#accessorValue = value;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
instanceMethod(argOne, argTwo) {
|
|
48
|
+
return `instance-method-${ argOne }-${ argTwo }`;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
instanceThrower() {
|
|
52
|
+
// You don't have to throw an Error object.
|
|
53
|
+
throw "Throw by instanceThrower()."
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// endregion Instance members
|
|
57
|
+
}
|