diff --git a/src/tools/mac-address-generator/index.ts b/src/tools/mac-address-generator/index.ts
index fcf811a6..9d20fb69 100644
--- a/src/tools/mac-address-generator/index.ts
+++ b/src/tools/mac-address-generator/index.ts
@@ -1,12 +1,12 @@
-import { Atom2 } from '@vicons/tabler';
+import { Devices } from '@vicons/tabler';
import { defineTool } from '../tool';
export const tool = defineTool({
name: 'MAC address generator',
path: '/mac-address-generator',
description: 'Enter the quantity and prefix. MAC addresses will be generated in your chosen case (uppercase or lowercase)',
- keywords: ['mac', 'address', 'generator'],
+ keywords: ['mac', 'address', 'generator', 'random', 'prefix'],
component: () => import('./mac-address-generator.vue'),
- icon: Atom2,
- createdAt: new Date('2023-10-11'),
+ icon: Devices,
+ createdAt: new Date('2023-11-31'),
});
diff --git a/src/tools/mac-address-generator/mac-address-generator.vue b/src/tools/mac-address-generator/mac-address-generator.vue
index 33875572..1af6730a 100644
--- a/src/tools/mac-address-generator/mac-address-generator.vue
+++ b/src/tools/mac-address-generator/mac-address-generator.vue
@@ -1,61 +1,92 @@
-
+
-
- Uppercase
-
+
+
+
{{ 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 00000000..5b660250
--- /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 00000000..45e434eb
--- /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 2d1011c4..f55c334d 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 };