Skip to content

Make Scratch 3 comparisons with +/-Infinity match Scratch 2 #1754

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 8 commits into from
Nov 29, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions src/engine/comment.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
*/

const uid = require('../util/uid');
const Cast = require('../util/cast');
const xmlEscape = require('../util/xml-escape');

class Comment {
Expand All @@ -23,8 +22,8 @@ class Comment {
this.text = text;
this.x = x;
this.y = y;
this.width = Math.max(Cast.toNumber(width), Comment.MIN_WIDTH);
this.height = Math.max(Cast.toNumber(height), Comment.MIN_HEIGHT);
this.width = Math.max(Number(width), Comment.MIN_WIDTH);
this.height = Math.max(Number(height), Comment.MIN_HEIGHT);
this.minimized = minimized || false;
this.blockId = null;
}
Expand Down
9 changes: 7 additions & 2 deletions src/util/cast.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@ class Cast {
}
return value;
}

const n = Number(value);
if (_NumberIsNaN(n)) {
// Scratch treats NaN as 0, when needed as a number.
Expand Down Expand Up @@ -144,9 +143,15 @@ class Cast {
}
return 0;
}
// Handle the special case of Infinity
if (
(n1 === Infinity && n2 === Infinity) ||
(n1 === -Infinity && n2 === -Infinity)
) {
return 0;
}
// Compare as numbers.
return n1 - n2;

}

/**
Expand Down
114 changes: 114 additions & 0 deletions test/unit/blocks_data_infinity.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
const test = require('tap').test;
const Data = require('../../src/blocks/scratch3_data');

const blocks = new Data();

const lists = {};
const util = {
target: {
lookupOrCreateList (id, name) {
if (!(name in lists)) {
lists[name] = {value: []};
}
return lists[name];
}
}
};

test('List with postive infinity primitive contains postive infinity', t => {
lists.list = {value: [Infinity]};
let args = {ITEM: Infinity, LIST: {name: 'list'}};
let contains = blocks.listContainsItem(args, util);
t.strictEqual(contains, true, '[Infinity] contains Infinity');

lists.list = {value: [Infinity]};
args = {ITEM: 'Infinity', LIST: {name: 'list'}};
contains = blocks.listContainsItem(args, util);
t.strictEqual(contains, true, '[Infinity] contains "Infinity"');

lists.list = {value: [Infinity]};
args = {ITEM: 'INFINITY', LIST: {name: 'list'}};
contains = blocks.listContainsItem(args, util);
t.strictEqual(contains, true, '[Infinity] contains "INFINITY"');

lists.list = {value: ['Infinity']};
args = {ITEM: Infinity, LIST: {name: 'list'}};
contains = blocks.listContainsItem(args, util);
t.strictEqual(contains, true, '["Infinity"] contains Infinity');

lists.list = {value: ['Infinity']};
args = {ITEM: 'Infinity', LIST: {name: 'list'}};
contains = blocks.listContainsItem(args, util);
t.strictEqual(contains, true, '["Infinity"] contains "Infinity"');

lists.list = {value: ['Infinity']};
args = {ITEM: 'INFINITY', LIST: {name: 'list'}};
contains = blocks.listContainsItem(args, util);
t.strictEqual(contains, true, '["Infinity"] contains "INFINITY"');

lists.list = {value: ['INFINITY']};
args = {ITEM: Infinity, LIST: {name: 'list'}};
contains = blocks.listContainsItem(args, util);
t.strictEqual(contains, true, '["INFINITY"] contains Infinity');

lists.list = {value: ['INFINITY']};
args = {ITEM: 'Infinity', LIST: {name: 'list'}};
contains = blocks.listContainsItem(args, util);
t.strictEqual(contains, true, '["INFINITY"] contains "Infinity"');

lists.list = {value: ['INFINITY']};
args = {ITEM: 'INFINITY', LIST: {name: 'list'}};
contains = blocks.listContainsItem(args, util);
t.strictEqual(contains, true, '["INFINITY"] contains "INFINITY"');

t.end();
});

test('List with negative infinity primitive contains negative infinity', t => {
lists.list = {value: [-Infinity]};
let args = {ITEM: -Infinity, LIST: {name: 'list'}};
let contains = blocks.listContainsItem(args, util);
t.strictEqual(contains, true, '[-Infinity] contains -Infinity');

lists.list = {value: [-Infinity]};
args = {ITEM: '-Infinity', LIST: {name: 'list'}};
contains = blocks.listContainsItem(args, util);
t.strictEqual(contains, true, '[-Infinity] contains "-Infinity"');

lists.list = {value: [-Infinity]};
args = {ITEM: '-INFINITY', LIST: {name: 'list'}};
contains = blocks.listContainsItem(args, util);
t.strictEqual(contains, true, '[-Infinity] contains "-INFINITY"');

lists.list = {value: ['-Infinity']};
args = {ITEM: -Infinity, LIST: {name: 'list'}};
contains = blocks.listContainsItem(args, util);
t.strictEqual(contains, true, '["-Infinity"] contains -Infinity');

lists.list = {value: ['-Infinity']};
args = {ITEM: '-Infinity', LIST: {name: 'list'}};
contains = blocks.listContainsItem(args, util);
t.strictEqual(contains, true, '["-Infinity"] contains "-Infinity"');

lists.list = {value: ['-Infinity']};
args = {ITEM: '-INFINITY', LIST: {name: 'list'}};
contains = blocks.listContainsItem(args, util);
t.strictEqual(contains, true, '["-Infinity"] contains "-INFINITY"');

lists.list = {value: ['-INFINITY']};
args = {ITEM: -Infinity, LIST: {name: 'list'}};
contains = blocks.listContainsItem(args, util);
t.strictEqual(contains, true, '["-INFINITY"] contains -Infinity');

lists.list = {value: ['-INFINITY']};
args = {ITEM: '-Infinity', LIST: {name: 'list'}};
contains = blocks.listContainsItem(args, util);
t.strictEqual(contains, true, '["-INFINITY"] contains "-Infinity"');

lists.list = {value: ['-INFINITY']};
args = {ITEM: '-INFINITY', LIST: {name: 'list'}};
contains = blocks.listContainsItem(args, util);
t.strictEqual(contains, true, '["-INFINITY"] contains "-INFINITY"');

t.end();
});
1 change: 0 additions & 1 deletion test/unit/blocks_operators.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ test('multiply', t => {

test('divide', t => {
t.strictEqual(blocks.divide({NUM1: '2', NUM2: '2'}), 1);
t.strictEqual(blocks.divide({NUM1: '1', NUM2: '0'}), Infinity); // @todo
t.ok(isNaN(blocks.divide({NUM1: 'foo', NUM2: 'bar'}))); // @todo
t.end();
});
Expand Down
Loading