# Conflicts:
#	package.json
This commit is contained in:
BorysLevytskyi
2023-05-05 11:12:09 +02:00
9 changed files with 77 additions and 33 deletions

View File

@@ -26,7 +26,7 @@
}, },
"scripts": { "scripts": {
"start": "react-scripts start", "start": "react-scripts start",
"build": "react-scripts build", "build": "react-scripts build & npx http-server ./build -p 3030",
"release": "react-scripts build & gh-pages -d build --message Release", "release": "react-scripts build & gh-pages -d build --message Release",
"test": "react-scripts test", "test": "react-scripts test",
"eject": "react-scripts eject", "eject": "react-scripts eject",

View File

@@ -1,11 +1,13 @@
import calc from './calc'; import calc from './calc';
import { BitwiseOperationExpression, NumericOperand, ExpressionOperand } from '../expression/expression'; import { BitwiseOperationExpression, NumericOperand, ExpressionOperand } from '../expression/expression';
import exp from 'constants';
describe("calc", () => { describe("calc", () => {
it('calculates number of bits', () => { it('calculates number of bits', () => {
expect(calc.numberOfBits(1)).toBe(1); expect(calc.numberOfBits(1)).toBe(1);
expect(calc.numberOfBits(2)).toBe(2); expect(calc.numberOfBits(2)).toBe(2);
expect(calc.numberOfBits(3)).toBe(2); expect(calc.numberOfBits(3)).toBe(2);
expect(calc.numberOfBits(68719476735)).toBe(36);
}); });
it('calculates max number of bits', () => { it('calculates max number of bits', () => {

View File

@@ -7,6 +7,14 @@ describe("formatter", () => {
expect(formatter.formatString(15, "bin")).toBe("1111"); expect(formatter.formatString(15, "bin")).toBe("1111");
}); });
it('formats large binary number correctly', () => {
var decimal = 68719476735;
var binary = formatter.bin(68719476735);
var hex = formatter.formatString(decimal, 'hex');
expect(binary).toBe('111111111111111111111111111111111111');
expect(hex).toBe('fffffffff');
})
it('pads left', () => { it('pads left', () => {
expect(formatter.padLeft("1", 3, " ")).toBe(" 1"); expect(formatter.padLeft("1", 3, " ")).toBe(" 1");
}); });

View File

@@ -1,4 +1,4 @@
import NumericOperand from './NumericOperand'; import NumericOperand, { INT_MAX_VALUE } from './NumericOperand';
it('parsed from string', () => { it('parsed from string', () => {
var op = NumericOperand.parse('123'); var op = NumericOperand.parse('123');
@@ -11,3 +11,16 @@ it('can get other kind', () => {
expect(op.getOtherBase('hex')).toBe('dec'); expect(op.getOtherBase('hex')).toBe('dec');
expect(op.getOtherBase('bin')).toBe('hex'); expect(op.getOtherBase('bin')).toBe('hex');
}); });
it('negtive value binary string', () => {
expect(NumericOperand.toBaseString(-1, 'bin')).toBe('11111111111111111111111111111111');
});
it('64 bit operand binary string', () => {
expect(NumericOperand.toBaseString(68719476735, 'bin')).toBe('111111111111111111111111111111111111');
});
it('throws on negative 64 bit numbers', () => {
var bigN = -(INT_MAX_VALUE+1);
expect(() => new NumericOperand(bigN)).toThrowError("BitwiseCmd currently doesn't support 64 bit negative numbers such as " + bigN);
})

View File

@@ -3,6 +3,10 @@ import { ExpressionInputItem, NumberBase } from './expression-interfaces';
var globalId : number = 1; var globalId : number = 1;
const INT_MAX_VALUE = 2147483647;
export {INT_MAX_VALUE};
// Represents numeric value // Represents numeric value
export default class NumericOperand implements ExpressionInputItem { export default class NumericOperand implements ExpressionInputItem {
id: number; id: number;
@@ -17,6 +21,9 @@ export default class NumericOperand implements ExpressionInputItem {
this.base = base || "dec"; this.base = base || "dec";
this.lengthInBits = NumericOperand.getBitLength(this.value); this.lengthInBits = NumericOperand.getBitLength(this.value);
this.isExpression = false; this.isExpression = false;
if(value < 0 && !NumericOperand.is32Bit(value))
throw new Error("BitwiseCmd currently doesn't support 64 bit negative numbers such as " + value);
} }
getLengthInBits() { getLengthInBits() {
@@ -102,7 +109,10 @@ export default class NumericOperand implements ExpressionInputItem {
var hexVal = Math.abs(value).toString(16); var hexVal = Math.abs(value).toString(16);
return value >= 0 ? '0x' + hexVal : '-0x' + hexVal; return value >= 0 ? '0x' + hexVal : '-0x' + hexVal;
case 'bin': case 'bin':
return (value>>>0).toString(2); // >>> 0 is used to get an actual bit representation of the negative numbers
// https://stackoverflow.com/questions/5747123/strange-javascript-operator-expr-0
const is32Bit = NumericOperand.is32Bit(value);
return (is32Bit && value < 0 ? (value >>> 0) : value).toString(2);
case 'dec': case 'dec':
return value.toString(10); return value.toString(10);
default: default:
@@ -113,4 +123,8 @@ export default class NumericOperand implements ExpressionInputItem {
static toHexString (hex : string) { static toHexString (hex : string) {
return hex.indexOf('-') === 0 ? '-0x' + hex.substr(1) : '0x' + hex; return hex.indexOf('-') === 0 ? '-0x' + hex.substr(1) : '0x' + hex;
}; };
static is32Bit(n: number) {
return Math.abs(n) <= INT_MAX_VALUE
}
} }

View File

@@ -86,7 +86,8 @@ class ExpressionRow extends React.Component<ExpressionRowProps> {
} }
getBinaryString() : string { getBinaryString() : string {
return this.props.expressionItem.evaluate().toBinaryString(); var binary = this.props.expressionItem.evaluate().toBinaryString();
return binary;
} }
getLabel(): string { getLabel(): string {

View File

@@ -1,6 +1,6 @@
import log from 'loglevel'; import log from 'loglevel';
const APP_VERSION = 7; const APP_VERSION = 8;
export type PersistedAppData = { export type PersistedAppData = {
emphasizeBytes: boolean; emphasizeBytes: boolean;

View File

@@ -6,6 +6,12 @@ function WhatsnewResultView() {
return <div className="changelog"> return <div className="changelog">
<h3>Changelog</h3> <h3>Changelog</h3>
<div className='item item-new'>
<p>
<span className="soft date">Jul 24th, 2021</span> <br/>
Fixed <a href="https://github.com/BorysLevytskyi/BitwiseCmd/issues/13">bug</a> with incorrect binary representation of 64 bit numbers. <u>Negative 64 bit numbers currently are not supported by BitwiseCmd</u>.
</p>
</div>
<div className="item item-new"> <div className="item item-new">
<p><span className="soft date">Jul 24th, 2021</span> <br/> <p><span className="soft date">Jul 24th, 2021</span> <br/>
<ul> <ul>

View File

@@ -18,7 +18,7 @@
"resolveJsonModule": true, "resolveJsonModule": true,
"isolatedModules": true, "isolatedModules": true,
"noEmit": true, "noEmit": true,
"jsx": "react-jsx" "jsx": "preserve"
}, },
"include": [ "include": [
"src" "src"