Simple serialization entities fixes and tests

This commit is contained in:
barsdeveloper
2024-03-30 20:07:26 +01:00
parent acedafc339
commit 279163cd54
24 changed files with 315 additions and 146 deletions

View File

@@ -10,6 +10,7 @@ import Union from "./Union.js"
/** @abstract */
export default class IEntity extends Serializable {
/** @type {{ [attribute: String]: AttributeInfo }} */
static attributes = {
attributes: new AttributeInfo({
ignored: true,
@@ -147,21 +148,6 @@ export default class IEntity extends Serializable {
return value != null && (value instanceof type || value.constructor === type)
}
static expectsAllKeys() {
return !Object.values(this.attributes)
.filter(/** @param {AttributeInformation} attribute */attribute => !attribute.ignored)
.some(/** @param {AttributeInformation} attribute */attribute => !attribute.expected)
}
static getAttribute(object, attribute) {
return this.getAttributes(object)[attribute]
}
/** @returns {AttributeDeclarations} */
static getAttributes(object) {
return object.attributes ?? object.constructor?.attributes ?? {}
}
static defineAttributes(object, attributes) {
Object.defineProperty(object, "attributes", {
writable: true,

View File

@@ -17,16 +17,18 @@ export default class Integer64Entity extends IEntity {
return Parsernostrum.numberBigInteger.map(v => new this(v))
}
/** @param {BigInt | Number} value */
constructor(value = 0) {
if (value.constructor !== Object) {
value = {
// @ts-expect-error
value: value,
/** @param {BigInt | Number | Object} values */
constructor(values = 0) {
if (values.constructor !== Object) {
values = {
value: values,
}
}
super(value)
/** @type {BigInt | Number} */ this.value
if (values.value === -0) {
values.value = 0n
}
super(values)
/** @type {BigInt} */ this.value
}
valueOf() {

View File

@@ -17,17 +17,18 @@ export default class IntegerEntity extends IEntity {
return Parsernostrum.numberInteger.map(v => new this(v))
}
/** @param {Number | AttributeInfo<IntegerEntity>} value */
constructor(value = 0) {
if (value === -0) {
value = 0
}
super(value.constructor === Object
? value
: {
value: value,
/** @param {Number | Object} values */
constructor(values = 0) {
if (values.constructor !== Object) {
values = {
value: values,
}
)
}
values.value = Math.floor(values.value)
if (values.value === -0) {
values.value = 0
}
super(values)
/** @type {Number} */ this.value
}

View File

@@ -8,13 +8,13 @@ export default class SimpleSerializationRotatorEntity extends RotatorEntity {
static createGrammar() {
const number = Parsernostrum.number.getParser().parser.regexp.source
return Parsernostrum.alt(
Parsernostrum.reg(new RegExp(
Parsernostrum.regArray(new RegExp(
"(" + number + ")"
+ "\\s*,\\s"
+ "\\s*,\\s*"
+ "(" + number + ")"
+ "\\s*,\\s"
+ "\\s*,\\s*"
+ "(" + number + ")"
)).map(([p, y, r]) => new this({
)).map(([_, p, y, r]) => new this({
R: Number(r),
P: Number(p),
Y: Number(y),

View File

@@ -8,11 +8,11 @@ export default class SimpleSerializationVector2DEntity extends Vector2DEntity {
static createGrammar() {
const number = Parsernostrum.number.getParser().parser.regexp.source
return Parsernostrum.alt(
Parsernostrum.reg(new RegExp(
Parsernostrum.regArray(new RegExp(
"(" + number + ")"
+ "\\s*,\\s"
+ "\\s*,\\s*"
+ "(" + number + ")"
)).map(([x, y]) => new this({
)).map(([_, x, y]) => new this({
X: Number(x),
Y: Number(y),
})),