{{ macAddresses }}
+ {{ macAddresses }}
diff --git a/src/tools/mac-address-generator/mac-adress-generator.models.test.ts b/src/tools/mac-address-generator/mac-adress-generator.models.test.ts
new file mode 100644
index 0000000000..5b660250ba
--- /dev/null
+++ b/src/tools/mac-address-generator/mac-adress-generator.models.test.ts
@@ -0,0 +1,43 @@
+import { describe, expect, it } from 'vitest';
+import { generateRandomMacAddress, splitPrefix } from './mac-adress-generator.models';
+
+describe('mac-adress-generator models', () => {
+ describe('splitPrefix', () => {
+ it('a mac address prefix is splitted around non hex characters', () => {
+ expect(splitPrefix('')).toEqual([]);
+ expect(splitPrefix('01')).toEqual(['01']);
+ expect(splitPrefix('01:')).toEqual(['01']);
+ expect(splitPrefix('01:23')).toEqual(['01', '23']);
+ expect(splitPrefix('01-23')).toEqual(['01', '23']);
+ });
+
+ it('when a prefix contains only hex characters, they are grouped by 2', () => {
+ expect(splitPrefix('0123')).toEqual(['01', '23']);
+ expect(splitPrefix('012345')).toEqual(['01', '23', '45']);
+ expect(splitPrefix('0123456')).toEqual(['01', '23', '45', '06']);
+ });
+ });
+
+ describe('generateRandomMacAddress', () => {
+ const createRandomByteGenerator = () => {
+ let i = 0;
+ return () => (i++).toString(16).padStart(2, '0');
+ };
+
+ it('generates a random mac address', () => {
+ expect(generateRandomMacAddress({ getRandomByte: createRandomByteGenerator() })).toBe('00:01:02:03:04:05');
+ });
+
+ it('generates a random mac address with a prefix', () => {
+ expect(generateRandomMacAddress({ prefix: 'ff:ee:aa', getRandomByte: createRandomByteGenerator() })).toBe('ff:ee:aa:00:01:02');
+ expect(generateRandomMacAddress({ prefix: 'ff:ee:a', getRandomByte: createRandomByteGenerator() })).toBe('ff:ee:0a:00:01:02');
+ });
+
+ it('generates a random mac address with a prefix and a different separator', () => {
+ expect(generateRandomMacAddress({ prefix: 'ff-ee-aa', separator: '-', getRandomByte: createRandomByteGenerator() })).toBe('ff-ee-aa-00-01-02');
+ expect(generateRandomMacAddress({ prefix: 'ff:ee:aa', separator: '-', getRandomByte: createRandomByteGenerator() })).toBe('ff-ee-aa-00-01-02');
+ expect(generateRandomMacAddress({ prefix: 'ff-ee:aa', separator: '-', getRandomByte: createRandomByteGenerator() })).toBe('ff-ee-aa-00-01-02');
+ expect(generateRandomMacAddress({ prefix: 'ff ee:aa', separator: '-', getRandomByte: createRandomByteGenerator() })).toBe('ff-ee-aa-00-01-02');
+ });
+ });
+});
diff --git a/src/tools/mac-address-generator/mac-adress-generator.models.ts b/src/tools/mac-address-generator/mac-adress-generator.models.ts
new file mode 100644
index 0000000000..45e434ebc3
--- /dev/null
+++ b/src/tools/mac-address-generator/mac-adress-generator.models.ts
@@ -0,0 +1,18 @@
+import _ from 'lodash';
+
+export { splitPrefix, generateRandomMacAddress };
+
+function splitPrefix(prefix: string): string[] {
+ const base = prefix.match(/[^0-9a-f]/i) === null ? prefix.match(/.{1,2}/g) ?? [] : prefix.split(/[^0-9a-f]/i);
+
+ return base.filter(Boolean).map(byte => byte.padStart(2, '0'));
+}
+
+function generateRandomMacAddress({ prefix: rawPrefix = '', separator = ':', getRandomByte = () => _.random(0, 255).toString(16).padStart(2, '0') }: { prefix?: string; separator?: string; getRandomByte?: () => string } = {}) {
+ const prefix = splitPrefix(rawPrefix);
+
+ const randomBytes = _.times(6 - prefix.length, getRandomByte);
+ const bytes = [...prefix, ...randomBytes];
+
+ return bytes.join(separator);
+}
diff --git a/src/utils/macAddress.ts b/src/utils/macAddress.ts
index 2d1011c4bd..f55c334dd1 100644
--- a/src/utils/macAddress.ts
+++ b/src/utils/macAddress.ts
@@ -18,15 +18,15 @@ function macAddressValidation(value: Ref) {
const partialMacAddressValidationRules = [
{
message: 'Invalid partial MAC address',
- validator: (value: string) => value.trim().match(/^([0-9A-Fa-f]{2}[:-]){0,5}([0-9A-Fa-f]{0,2})$/),
+ validator: (value: string) => value.trim().match(/^([0-9a-f]{2}[:\-. ]){0,5}([0-9a-f]{0,2})$/i),
},
];
-function partialMacAddressValidation(value: Ref) {
+function usePartialMacAddressValidation(value: Ref) {
return useValidation({
source: value,
rules: partialMacAddressValidationRules,
});
}
-export { macAddressValidation, macAddressValidationRules, partialMacAddressValidation, partialMacAddressValidationRules };
+export { macAddressValidation, macAddressValidationRules, usePartialMacAddressValidation, partialMacAddressValidationRules };
From 5be20923ed21e1e13892e45da74618e7146ec734 Mon Sep 17 00:00:00 2001
From: Corentin Thomasset