'use strict';

const common = require('../common');
const assert = require('assert');
const dgram = require('dgram');

const PORT = 12345;

const client = dgram.createSocket('udp4');
client.connect(PORT, common.mustCall(() => {
  const remoteAddr = client.remoteAddress();
  assert.strictEqual(remoteAddr.port, PORT);
  assert.throws(() => {
    client.connect(PORT, common.mustNotCall());
  }, {
    name: 'Error',
    message: /Socket is connected|Already connected/,
    code: 'ERR_SOCKET_DGRAM_IS_CONNECTED'
  });

  client.disconnect();
  assert.throws(() => {
    client.disconnect();
  }, {
    name: 'Error',
    message: /(Socket is n|N)ot connected/,
    code: 'ERR_SOCKET_DGRAM_NOT_CONNECTED'
  });

  assert.throws(() => {
    client.remoteAddress();
  }, {
    name: 'Error',
    message: /(Socket is n|N)ot connected/,
    code: 'ERR_SOCKET_DGRAM_NOT_CONNECTED'
  });

  client.once('connect', common.mustCall(() => client.close()));
  client.connect(PORT);
}));

assert.throws(() => {
  client.connect(PORT);
}, {
  name: 'Error',
  message: /Socket is connected|Already connected/,
  code: 'ERR_SOCKET_DGRAM_IS_CONNECTED'
});

assert.throws(() => {
  client.disconnect();
}, {
  name: 'Error',
  message: /(Socket is n|N)ot connected/,
  code: 'ERR_SOCKET_DGRAM_NOT_CONNECTED'
});

[ 0, null, 78960, undefined ].forEach((port) => {
  assert.throws(() => {
    client.connect(port);
  }, {
    name: 'RangeError',
    message: /(Port|"Port") should be > 0 and < 65536/,
    code: 'ERR_SOCKET_BAD_PORT'
  });
});
