diff --git a/src/main/java/com/structurizr/dsl/IdentifiersRegister.java b/src/main/java/com/structurizr/dsl/IdentifiersRegister.java index bef26ce..ecbef0c 100644 --- a/src/main/java/com/structurizr/dsl/IdentifiersRegister.java +++ b/src/main/java/com/structurizr/dsl/IdentifiersRegister.java @@ -16,7 +16,7 @@ */ public class IdentifiersRegister { - private static final Pattern IDENTIFIER_PATTERN = Pattern.compile("\\w+"); + private static final Pattern IDENTIFIER_PATTERN = Pattern.compile("\\w[a-zA-Z0-9_-]*"); private IdentifierScope identifierScope = IdentifierScope.Flat; @@ -180,8 +180,12 @@ public String findIdentifier(Relationship relationship) { } void validateIdentifierName(String identifier) { + if (identifier.startsWith("-")) { + throw new RuntimeException("Identifiers cannot start with a - character"); + } + if (!IDENTIFIER_PATTERN.matcher(identifier).matches()) { - throw new RuntimeException("Identifiers can only contain the following characters: a-zA-Z_0-9"); + throw new RuntimeException("Identifiers can only contain the following characters: a-zA-Z0-9_-"); } } diff --git a/src/test/java/com/structurizr/dsl/IdentifierRegisterTests.java b/src/test/java/com/structurizr/dsl/IdentifierRegisterTests.java index 39188dc..15936e9 100644 --- a/src/test/java/com/structurizr/dsl/IdentifierRegisterTests.java +++ b/src/test/java/com/structurizr/dsl/IdentifierRegisterTests.java @@ -8,7 +8,33 @@ class IdentifierRegisterTests extends AbstractTests { - private IdentifiersRegister register = new IdentifiersRegister(); + private final IdentifiersRegister register = new IdentifiersRegister(); + + @Test + void test_validateIdentifierName() { + new IdentifiersRegister().validateIdentifierName("a"); + new IdentifiersRegister().validateIdentifierName("abc"); + new IdentifiersRegister().validateIdentifierName("ABC"); + new IdentifiersRegister().validateIdentifierName("softwaresystem"); + new IdentifiersRegister().validateIdentifierName("SoftwareSystem"); + new IdentifiersRegister().validateIdentifierName("123456"); + new IdentifiersRegister().validateIdentifierName("_softwareSystem"); + new IdentifiersRegister().validateIdentifierName("SoftwareSystem-1"); + + try { + new IdentifiersRegister().validateIdentifierName("-softwareSystem"); + fail(); + } catch (Exception e) { + assertEquals("Identifiers cannot start with a - character", e.getMessage()); + } + + try { + new IdentifiersRegister().validateIdentifierName("SoftwareSystém"); + fail(); + } catch (Exception e) { + assertEquals("Identifiers can only contain the following characters: a-zA-Z0-9_-", e.getMessage()); + } + } @Test void test_register_ThrowsAnException_WhenTheElementHasAlreadyBeenRegisteredWithADifferentIdentifier() {