fh1ch/node-bacstack

View on GitHub
test/unit/service-read-property.spec.js

Summary

Maintainability
C
1 day
Test Coverage
'use strict';

const utils = require('./utils');
const baServices = require('../../lib/services');
const baEnum = require('../../lib/enum');

describe('bacstack - Services layer ReadProperty unit', () => {
  it('should successfully encode and decode', () => {
    const buffer = utils.getBuffer();
    baServices.readProperty.encode(buffer, 4, 630, 85, 0xFFFFFFFF);
    const result = baServices.readProperty.decode(buffer.buffer, 0, buffer.offset);
    delete result.len;
    expect(result).toEqual({
      objectId: {type: 4, instance: 630},
      property: {id: 85, index: 0xFFFFFFFF}
    });
  });

  it('should successfully encode and decode with object-tye > 512', () => {
    const buffer = utils.getBuffer();
    baServices.readProperty.encode(buffer, 630, 5, 12, 0xFFFFFFFF);
    const result = baServices.readProperty.decode(buffer.buffer, 0, buffer.offset);
    delete result.len;
    expect(result).toEqual({
      objectId: {type: 630, instance: 5},
      property: {id: 12, index: 0xFFFFFFFF}
    });
  });

  it('should successfully encode and decode with array index', () => {
    const buffer = utils.getBuffer();
    baServices.readProperty.encode(buffer, 4, 630, 85, 2);
    const result = baServices.readProperty.decode(buffer.buffer, 0, buffer.offset);
    delete result.len;
    expect(result).toEqual({
      objectId: {type: 4, instance: 630},
      property: {id: 85, index: 2}
    });
  });
});

describe('ReadPropertyAcknowledge', () => {
  it('should successfully encode and decode a boolean value', () => {
    const buffer = utils.getBuffer();
    baServices.readProperty.encodeAcknowledge(buffer, {type: 8, instance: 40000}, 81, 0xFFFFFFFF, [
      {type: 1, value: true},
      {type: 1, value: false}
    ]);
    const result = baServices.readProperty.decodeAcknowledge(buffer.buffer, 0, buffer.offset);
    delete result.len;
    expect(result).toEqual({
      objectId: {
        type: 8,
        instance: 40000
      },
      property: {
        index: 0xFFFFFFFF,
        id: 81
      },
      values: [
        {type: 1, value: true},
        {type: 1, value: false}
      ]
    });
  });

  it('should successfully encode and decode a boolean value with array index', () => {
    const buffer = utils.getBuffer();
    baServices.readProperty.encodeAcknowledge(buffer, {type: 8, instance: 40000}, 81, 2, [
      {type: 1, value: true}
    ]);
    const result = baServices.readProperty.decodeAcknowledge(buffer.buffer, 0, buffer.offset);
    delete result.len;
    expect(result).toEqual({
      objectId: {
        type: 8,
        instance: 40000
      },
      property: {
        index: 2,
        id: 81
      },
      values: [
        {type: 1, value: true}
      ]
    });
  });

  it('should successfully encode and decode an unsigned value', () => {
    const buffer = utils.getBuffer();
    baServices.readProperty.encodeAcknowledge(buffer, {type: 8, instance: 40000}, 81, 0xFFFFFFFF, [
      {type: 2, value: 1},
      {type: 2, value: 1000},
      {type: 2, value: 1000000},
      {type: 2, value: 1000000000}
    ]);
    const result = baServices.readProperty.decodeAcknowledge(buffer.buffer, 0, buffer.offset);
    delete result.len;
    expect(result).toEqual({
      objectId: {
        type: 8,
        instance: 40000
      },
      property: {
        index: 0xFFFFFFFF,
        id: 81
      },
      values: [
        {type: 2, value: 1},
        {type: 2, value: 1000},
        {type: 2, value: 1000000},
        {type: 2, value: 1000000000}
      ]
    });
  });

  it('should successfully encode and decode a signed value', () => {
    const buffer = utils.getBuffer();
    baServices.readProperty.encodeAcknowledge(buffer, {type: 8, instance: 40000}, 81, 0xFFFFFFFF, [
      {type: 3, value: -1},
      {type: 3, value: -1000},
      {type: 3, value: -1000000},
      {type: 3, value: -1000000000}
    ]);
    const result = baServices.readProperty.decodeAcknowledge(buffer.buffer, 0, buffer.offset);
    delete result.len;
    expect(result).toEqual({
      objectId: {
        type: 8,
        instance: 40000
      },
      property: {
        index: 0xFFFFFFFF,
        id: 81
      },
      values: [
        {type: 3, value: -1},
        {type: 3, value: -1000},
        {type: 3, value: -1000000},
        {type: 3, value: -1000000000}
      ]
    });
  });

  it('should successfully encode and decode an real value', () => {
    const buffer = utils.getBuffer();
    baServices.readProperty.encodeAcknowledge(buffer, {type: 8, instance: 40000}, 81, 0xFFFFFFFF, [
      {type: 4, value: 0},
      {type: 4, value: 0.1}
    ]);
    const result = baServices.readProperty.decodeAcknowledge(buffer.buffer, 0, buffer.offset);
    delete result.len;
    expect(Math.floor(0.1 * 10000)).toEqual(Math.floor(result.values[1].value * 10000));
    result.values[1].value = 0;
    expect(result).toEqual({
      objectId: {
        type: 8,
        instance: 40000
      },
      property: {
        index: 0xFFFFFFFF,
        id: 81
      },
      values: [
        {type: 4, value: 0},
        {type: 4, value: 0}
      ]
    });
  });

  it('should successfully encode and decode a double value', () => {
    const buffer = utils.getBuffer();
    baServices.readProperty.encodeAcknowledge(buffer, {type: 8, instance: 40000}, 81, 0xFFFFFFFF, [
      {type: 5, value: 0},
      {type: 5, value: 100.121212}
    ]);
    const result = baServices.readProperty.decodeAcknowledge(buffer.buffer, 0, buffer.offset);
    delete result.len;
    expect(result).toEqual({
      objectId: {
        type: 8,
        instance: 40000
      },
      property: {
        index: 0xFFFFFFFF,
        id: 81
      },
      values: [
        {type: 5, value: 0},
        {type: 5, value: 100.121212}
      ]
    });
  });

  it('should successfully encode and decode an octet-string value', () => {
    const buffer = utils.getBuffer();
    baServices.readProperty.encodeAcknowledge(buffer, {type: 8, instance: 40000}, 81, 0xFFFFFFFF, [
      {type: 6, value: []},
      {type: 6, value: [1, 2, 100, 200]}
    ]);
    const result = baServices.readProperty.decodeAcknowledge(buffer.buffer, 0, buffer.offset);
    delete result.len;
    expect(result).toEqual({
      objectId: {
        type: 8,
        instance: 40000
      },
      property: {
        index: 0xFFFFFFFF,
        id: 81
      },
      values: [
        {type: 6, value: []},
        {type: 6, value: [1, 2, 100, 200]}
      ]
    });
  });

  it('should successfully encode and decode a character-string value', () => {
    const buffer = utils.getBuffer();
    baServices.readProperty.encodeAcknowledge(buffer, {type: 8, instance: 40000}, 81, 0xFFFFFFFF, [
      {type: 7, value: ''},
      {type: 7, value: 'Test1234$äöü'}
    ]);
    const result = baServices.readProperty.decodeAcknowledge(buffer.buffer, 0, buffer.offset);
    delete result.len;
    expect(result).toEqual({
      objectId: {
        type: 8,
        instance: 40000
      },
      property: {
        index: 0xFFFFFFFF,
        id: 81
      },
      values: [
        {type: 7, value: '', encoding: 0},
        {type: 7, value: 'Test1234$äöü', encoding: 0}
      ]
    });
  });

  it('should successfully encode and decode a character-string value with ISO-8859-1 encoding', () => {
    const buffer = utils.getBuffer();
    baServices.readProperty.encodeAcknowledge(buffer, {type: 8, instance: 40000}, 81, 0xFFFFFFFF, [
      {type: 7, value: '', encoding: baEnum.CharacterStringEncoding.ISO_8859_1},
      {type: 7, value: 'Test1234$äöü', encoding: baEnum.CharacterStringEncoding.ISO_8859_1}
    ]);
    const result = baServices.readProperty.decodeAcknowledge(buffer.buffer, 0, buffer.offset);
    delete result.len;
    expect(result).toEqual({
      objectId: {
        type: 8,
        instance: 40000
      },
      property: {
        index: 0xFFFFFFFF,
        id: 81
      },
      values: [
        {type: 7, value: '', encoding: baEnum.CharacterStringEncoding.ISO_8859_1},
        {type: 7, value: 'Test1234$äöü', encoding: baEnum.CharacterStringEncoding.ISO_8859_1}
      ]
    });
  });

  it('should successfully encode and decode a character-string value with UCS2 encoding', () => {
    const buffer = utils.getBuffer();
    baServices.readProperty.encodeAcknowledge(buffer, {type: 8, instance: 40000}, 81, 0xFFFFFFFF, [
      {type: 7, value: '', encoding: baEnum.CharacterStringEncoding.UCS_2},
      {type: 7, value: 'Test1234$äöü', encoding: baEnum.CharacterStringEncoding.UCS_2}
    ]);
    const result = baServices.readProperty.decodeAcknowledge(buffer.buffer, 0, buffer.offset);
    delete result.len;
    expect(result).toEqual({
      objectId: {
        type: 8,
        instance: 40000
      },
      property: {
        index: 0xFFFFFFFF,
        id: 81
      },
      values: [
        {type: 7, value: '', encoding: baEnum.CharacterStringEncoding.UCS_2},
        {type: 7, value: 'Test1234$äöü', encoding: baEnum.CharacterStringEncoding.UCS_2}
      ]
    });
  });

  it('should successfully encode and decode a character-string value with Codepage850 encoding', () => {
    const buffer = utils.getBuffer();
    baServices.readProperty.encodeAcknowledge(buffer, {type: 8, instance: 40000}, 81, 0xFFFFFFFF, [
      {type: 7, value: '', encoding: baEnum.CharacterStringEncoding.MICROSOFT_DBCS},
      {type: 7, value: 'Test1234$äöü', encoding: baEnum.CharacterStringEncoding.MICROSOFT_DBCS}
    ]);
    const result = baServices.readProperty.decodeAcknowledge(buffer.buffer, 0, buffer.offset);
    delete result.len;
    expect(result).toEqual({
      objectId: {
        type: 8,
        instance: 40000
      },
      property: {
        index: 0xFFFFFFFF,
        id: 81
      },
      values: [
        {type: 7, value: '', encoding: baEnum.CharacterStringEncoding.MICROSOFT_DBCS},
        {type: 7, value: 'Test1234$äöü', encoding: baEnum.CharacterStringEncoding.MICROSOFT_DBCS}
      ]
    });
  });

  it('should successfully encode and decode a character-string value with JISX-0208 encoding', () => {
    const buffer = utils.getBuffer();
    baServices.readProperty.encodeAcknowledge(buffer, {type: 8, instance: 40000}, 81, 0xFFFFFFFF, [
      {type: 7, value: '', encoding: baEnum.CharacterStringEncoding.JIS_X_0208},
      {type: 7, value: 'できます', encoding: baEnum.CharacterStringEncoding.JIS_X_0208}
    ]);
    const result = baServices.readProperty.decodeAcknowledge(buffer.buffer, 0, buffer.offset);
    delete result.len;
    expect(result).toEqual({
      objectId: {
        type: 8,
        instance: 40000
      },
      property: {
        index: 0xFFFFFFFF,
        id: 81
      },
      values: [
        {type: 7, value: '', encoding: baEnum.CharacterStringEncoding.JIS_X_0208},
        {type: 7, value: 'できます', encoding: baEnum.CharacterStringEncoding.JIS_X_0208}
      ]
    });
  });

  it('should successfully encode and decode a bit-string value', () => {
    const buffer = utils.getBuffer();
    baServices.readProperty.encodeAcknowledge(buffer, {type: 8, instance: 40000}, 81, 0xFFFFFFFF, [
      {type: 8, value: {bitsUsed: 0, value: []}},
      {type: 8, value: {bitsUsed: 24, value: [0xAA, 0xAA, 0xAA]}}
    ]);
    const result = baServices.readProperty.decodeAcknowledge(buffer.buffer, 0, buffer.offset);
    delete result.len;
    expect(result).toEqual({
      objectId: {
        type: 8,
        instance: 40000
      },
      property: {
        index: 0xFFFFFFFF,
        id: 81
      },
      values: [
        {type: 8, value: {bitsUsed: 0, value: []}},
        {type: 8, value: {bitsUsed: 24, value: [0xAA, 0xAA, 0xAA]}}
      ]
    });
  });

  it('should successfully encode and decode a enumeration value', () => {
    const buffer = utils.getBuffer();
    baServices.readProperty.encodeAcknowledge(buffer, {type: 8, instance: 40000}, 81, 0xFFFFFFFF, [
      {type: 9, value: 0},
      {type: 9, value: 4}
    ]);
    const result = baServices.readProperty.decodeAcknowledge(buffer.buffer, 0, buffer.offset);
    delete result.len;
    expect(result).toEqual({
      objectId: {
        type: 8,
        instance: 40000
      },
      property: {
        index: 0xFFFFFFFF,
        id: 81
      },
      values: [
        {type: 9, value: 0},
        {type: 9, value: 4}
      ]
    });
  });

  it('should successfully encode and decode a date value', () => {
    const buffer = utils.getBuffer();
    const date = new Date(1, 1, 1);
    baServices.readProperty.encodeAcknowledge(buffer, {type: 8, instance: 40000}, 81, 0xFFFFFFFF, [
      {type: 10, value: date}
    ]);
    const result = baServices.readProperty.decodeAcknowledge(buffer.buffer, 0, buffer.offset);
    delete result.len;
    expect(result).toEqual({
      objectId: {
        type: 8,
        instance: 40000
      },
      property: {
        index: 0xFFFFFFFF,
        id: 81
      },
      values: [
        {type: 10, value: date}
      ]
    });
  });

  it('should successfully encode and decode a time value', () => {
    const buffer = utils.getBuffer();
    const time = new Date(1, 1, 1);
    time.setMilliseconds(990);
    baServices.readProperty.encodeAcknowledge(buffer, {type: 8, instance: 40000}, 81, 0xFFFFFFFF, [
      {type: 11, value: time}
    ]);
    const result = baServices.readProperty.decodeAcknowledge(buffer.buffer, 0, buffer.offset);
    delete result.len;
    expect(result).toEqual({
      objectId: {
        type: 8,
        instance: 40000
      },
      property: {
        index: 0xFFFFFFFF,
        id: 81
      },
      values: [
        {type: 11, value: time}
      ]
    });
  });

  it('should successfully encode and decode a object-identifier value', () => {
    const buffer = utils.getBuffer();
    baServices.readProperty.encodeAcknowledge(buffer, {type: 8, instance: 40000}, 81, 0xFFFFFFFF, [
      {type: 12, value: {type: 3, instance: 0}},
      {type: 12, value: {type: 3, instance: 50000}}
    ]);
    const result = baServices.readProperty.decodeAcknowledge(buffer.buffer, 0, buffer.offset);
    delete result.len;
    expect(result).toEqual({
      objectId: {
        type: 8,
        instance: 40000
      },
      property: {
        index: 0xFFFFFFFF,
        id: 81
      },
      values: [
        {type: 12, value: {type: 3, instance: 0}},
        {type: 12, value: {type: 3, instance: 50000}}
      ]
    });
  });

  it('should successfully encode and decode a cov-subscription value', () => {
    const buffer = utils.getBuffer();
    baServices.readProperty.encodeAcknowledge(buffer, {type: 222, instance: 3}, 152, 0xFFFFFFFF, [
      {type: 111, value: {
        recipient: {network: 12, address: [0, 1]},
        subscriptionProcessId: 3,
        monitoredObjectId: {type: 2, instance: 1},
        monitoredProperty: {id: 85, index: 0},
        issueConfirmedNotifications: false,
        timeRemaining: 5,
        covIncrement: 1
      }},
      {type: 111, value: {
        recipient: {network: 0xFFFF, address: []},
        subscriptionProcessId: 3,
        monitoredObjectId: {type: 2, instance: 1},
        monitoredProperty: {id: 85, index: 5},
        issueConfirmedNotifications: true,
        timeRemaining: 5
      }}
    ]);
    const result = baServices.readProperty.decodeAcknowledge(buffer.buffer, 0, buffer.offset);
    delete result.len;
    expect(result).toEqual({
      objectId: {
        type: 222,
        instance: 3
      },
      property: {
        index: 0xFFFFFFFF,
        id: 152
      },
      values: [
        {type: 111, value: {
          recipient: {net: 12, adr: [0, 1]},
          subscriptionProcessId: 3,
          monitoredObjectId: {type: 2, instance: 1},
          monitoredProperty: {id: 85, index: 0},
          issueConfirmedNotifications: false,
          timeRemaining: 5,
          covIncrement: 1
        }},
        {type: 111, value: {
          recipient: {net: 0xFFFF, adr: []},
          subscriptionProcessId: 3,
          monitoredObjectId: {type: 2, instance: 1},
          monitoredProperty: {id: 85, index: 5},
          issueConfirmedNotifications: true,
          timeRemaining: 5
        }}
      ]
    });
  });

  it('should successfully encode and decode a read-access-specification value', () => {
    const buffer = utils.getBuffer();
    baServices.readProperty.encodeAcknowledge(buffer, {type: 223, instance: 90000}, 53, 0xFFFFFFFF, [
      {type: 115, value: {objectId: {type: 3, instance: 0}, properties: []}},
      {type: 115, value: {objectId: {type: 3, instance: 50000}, properties: [
        {id: 85},
        {id: 1, index: 2}
      ]}}
    ]);
    const result = baServices.readProperty.decodeAcknowledge(buffer.buffer, 0, buffer.offset);
    delete result.len;
    expect(result).toEqual({
      objectId: {
        type: 223,
        instance: 90000
      },
      property: {
        index: 0xFFFFFFFF,
        id: 53
      },
      values: [
        {type: 115, value: {objectId: {type: 3, instance: 0}, properties: []}},
        {type: 115, value: {objectId: {type: 3, instance: 50000}, properties: [
          {id: 85, index: 0xFFFFFFFF},
          {id: 1, index: 2}
        ]}}
      ]
    });
  });
});