mirror of
https://github.com/mermaid-js/mermaid.git
synced 2025-10-13 11:09:39 +02:00
Compare commits
4 Commits
renovate/p
...
bugfix/545
Author | SHA1 | Date | |
---|---|---|---|
![]() |
6cf17a9852 | ||
![]() |
07bd381197 | ||
![]() |
3bb9416537 | ||
![]() |
3e6b7bc3df |
2
.github/workflows/e2e-timings.yml
vendored
2
.github/workflows/e2e-timings.yml
vendored
@@ -58,7 +58,7 @@ jobs:
|
|||||||
echo "EOF" >> $GITHUB_OUTPUT
|
echo "EOF" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: Commit and create pull request
|
- name: Commit and create pull request
|
||||||
uses: peter-evans/create-pull-request@46cdba753c74545733b821043d64bd6925fc4da9
|
uses: peter-evans/create-pull-request@915d841dae6a4f191bb78faf61a257411d7be4d2
|
||||||
with:
|
with:
|
||||||
add-paths: |
|
add-paths: |
|
||||||
cypress/timings.json
|
cypress/timings.json
|
||||||
|
@@ -603,10 +603,6 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="test">
|
<div class="test">
|
||||||
<pre class="mermaid">
|
<pre class="mermaid">
|
||||||
---
|
|
||||||
config:
|
|
||||||
theme: dark
|
|
||||||
---
|
|
||||||
classDiagram
|
classDiagram
|
||||||
test ()--() test2
|
test ()--() test2
|
||||||
</pre>
|
</pre>
|
||||||
|
@@ -287,6 +287,7 @@ To describe the visibility (or encapsulation) of an attribute or method/function
|
|||||||
>
|
>
|
||||||
> - `*` Abstract e.g.: `someAbstractMethod()*` or `someAbstractMethod() int*`
|
> - `*` Abstract e.g.: `someAbstractMethod()*` or `someAbstractMethod() int*`
|
||||||
> - `$` Static e.g.: `someStaticMethod()$` or `someStaticMethod() String$`
|
> - `$` Static e.g.: `someStaticMethod()$` or `someStaticMethod() String$`
|
||||||
|
> - `$*` OR `*$` Both e.g: `someAbstractStaticMethod()$*` or `someAbstractStaticMethod() int$*`
|
||||||
|
|
||||||
> _note_ you can also include additional _classifiers_ to a field definition by adding the following notation to the very end:
|
> _note_ you can also include additional _classifiers_ to a field definition by adding the following notation to the very end:
|
||||||
>
|
>
|
||||||
|
@@ -265,6 +265,10 @@ export class ClassDB implements DiagramDB {
|
|||||||
theClass.annotations.push(sanitizeText(memberString.substring(2, memberString.length - 2)));
|
theClass.annotations.push(sanitizeText(memberString.substring(2, memberString.length - 2)));
|
||||||
} else if (memberString.indexOf(')') > 0) {
|
} else if (memberString.indexOf(')') > 0) {
|
||||||
//its a method
|
//its a method
|
||||||
|
if (memberString.length < 2) {
|
||||||
|
// Too short to be a method, ignore
|
||||||
|
return;
|
||||||
|
}
|
||||||
theClass.methods.push(new ClassMember(memberString, 'method'));
|
theClass.methods.push(new ClassMember(memberString, 'method'));
|
||||||
} else if (memberString) {
|
} else if (memberString) {
|
||||||
theClass.members.push(new ClassMember(memberString, 'attribute'));
|
theClass.members.push(new ClassMember(memberString, 'attribute'));
|
||||||
@@ -627,7 +631,7 @@ export class ClassDB implements DiagramDB {
|
|||||||
padding: config.class!.padding ?? 16,
|
padding: config.class!.padding ?? 16,
|
||||||
// parent node must be one of [rect, roundedWithTitle, noteGroup, divider]
|
// parent node must be one of [rect, roundedWithTitle, noteGroup, divider]
|
||||||
shape: 'rect',
|
shape: 'rect',
|
||||||
cssStyles: [],
|
cssStyles: ['fill: none', 'stroke: black'],
|
||||||
look: config.look,
|
look: config.look,
|
||||||
};
|
};
|
||||||
nodes.push(node);
|
nodes.push(node);
|
||||||
|
317
packages/mermaid/src/diagrams/class/classTypes.attribute.spec.ts
Normal file
317
packages/mermaid/src/diagrams/class/classTypes.attribute.spec.ts
Normal file
@@ -0,0 +1,317 @@
|
|||||||
|
import { ClassMember } from './classTypes.js';
|
||||||
|
import { vi, describe, it, expect } from 'vitest';
|
||||||
|
const spyOn = vi.spyOn;
|
||||||
|
|
||||||
|
const staticCssStyle = 'text-decoration:underline;';
|
||||||
|
const abstractCssStyle = 'font-style:italic;';
|
||||||
|
const abstractStaticCssStyle = 'text-decoration:underline;font-style:italic;';
|
||||||
|
|
||||||
|
describe('ClassTypes - Attribute Tests', () => {
|
||||||
|
describe('Basic attribute parsing without classifiers', () => {
|
||||||
|
it('should parse attribute with no modifiers', () => {
|
||||||
|
const str = 'name String';
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('name String');
|
||||||
|
expect(displayDetails.cssStyle).toBe('');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse attribute with public "+" visibility', () => {
|
||||||
|
const str = '+name String';
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('+name String');
|
||||||
|
expect(displayDetails.cssStyle).toBe('');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse attribute with protected "#" visibility', () => {
|
||||||
|
const str = '#name String';
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('#name String');
|
||||||
|
expect(displayDetails.cssStyle).toBe('');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse attribute with private "-" visibility', () => {
|
||||||
|
const str = '-name String';
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('-name String');
|
||||||
|
expect(displayDetails.cssStyle).toBe('');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse attribute with internal "~" visibility', () => {
|
||||||
|
const str = '~name String';
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('~name String');
|
||||||
|
expect(displayDetails.cssStyle).toBe('');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse simple attribute name only', () => {
|
||||||
|
const str = 'id';
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('id');
|
||||||
|
expect(displayDetails.cssStyle).toBe('');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse attribute with visibility and name only', () => {
|
||||||
|
const str = '+id';
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('+id');
|
||||||
|
expect(displayDetails.cssStyle).toBe('');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('Static classifier ($) attributes', () => {
|
||||||
|
it('should parse static attribute without visibility', () => {
|
||||||
|
const str = 'count int$';
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('count int');
|
||||||
|
expect(displayDetails.cssStyle).toBe(staticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse static attribute with public visibility', () => {
|
||||||
|
const str = '+count int$';
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('+count int');
|
||||||
|
expect(displayDetails.cssStyle).toBe(staticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse static attribute with protected visibility', () => {
|
||||||
|
const str = '#count int$';
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('#count int');
|
||||||
|
expect(displayDetails.cssStyle).toBe(staticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse static attribute with private visibility', () => {
|
||||||
|
const str = '-count int$';
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('-count int');
|
||||||
|
expect(displayDetails.cssStyle).toBe(staticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse static attribute with internal visibility', () => {
|
||||||
|
const str = '~count int$';
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('~count int');
|
||||||
|
expect(displayDetails.cssStyle).toBe(staticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse static attribute name only', () => {
|
||||||
|
const str = 'MAX_SIZE$';
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('MAX_SIZE');
|
||||||
|
expect(displayDetails.cssStyle).toBe(staticCssStyle);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('Abstract classifier (*) attributes', () => {
|
||||||
|
it('should parse abstract attribute without visibility', () => {
|
||||||
|
const str = 'data String*';
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('data String');
|
||||||
|
expect(displayDetails.cssStyle).toBe(abstractCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse abstract attribute with public visibility', () => {
|
||||||
|
const str = '+data String*';
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('+data String');
|
||||||
|
expect(displayDetails.cssStyle).toBe(abstractCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse abstract attribute with protected visibility', () => {
|
||||||
|
const str = '#data String*';
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('#data String');
|
||||||
|
expect(displayDetails.cssStyle).toBe(abstractCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse abstract attribute with private visibility', () => {
|
||||||
|
const str = '-data String*';
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('-data String');
|
||||||
|
expect(displayDetails.cssStyle).toBe(abstractCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse abstract attribute with internal visibility', () => {
|
||||||
|
const str = '~data String*';
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('~data String');
|
||||||
|
expect(displayDetails.cssStyle).toBe(abstractCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse abstract attribute name only', () => {
|
||||||
|
const str = 'value*';
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('value');
|
||||||
|
expect(displayDetails.cssStyle).toBe(abstractCssStyle);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('Abstract and Static combined classifiers', () => {
|
||||||
|
it('should parse abstract+static ($*) attribute without visibility', () => {
|
||||||
|
const str = 'config Map$*';
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('config Map');
|
||||||
|
expect(displayDetails.cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse static+abstract (*$) attribute without visibility', () => {
|
||||||
|
const str = 'config Map*$';
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('config Map');
|
||||||
|
expect(displayDetails.cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse abstract+static ($*) attribute with public visibility', () => {
|
||||||
|
const str = '+config Map$*';
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('+config Map');
|
||||||
|
expect(displayDetails.cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse static+abstract (*$) attribute with public visibility', () => {
|
||||||
|
const str = '+config Map*$';
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('+config Map');
|
||||||
|
expect(displayDetails.cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse abstract+static ($*) attribute with protected visibility', () => {
|
||||||
|
const str = '#registry HashMap$*';
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('#registry HashMap');
|
||||||
|
expect(displayDetails.cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse static+abstract (*$) attribute with protected visibility', () => {
|
||||||
|
const str = '#registry HashMap*$';
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('#registry HashMap');
|
||||||
|
expect(displayDetails.cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse abstract+static ($*) attribute with private visibility', () => {
|
||||||
|
const str = '-cache LRUCache$*';
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('-cache LRUCache');
|
||||||
|
expect(displayDetails.cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse static+abstract (*$) attribute with private visibility', () => {
|
||||||
|
const str = '-cache LRUCache*$';
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('-cache LRUCache');
|
||||||
|
expect(displayDetails.cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse abstract+static ($*) attribute with internal visibility', () => {
|
||||||
|
const str = '~pool ThreadPool$*';
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('~pool ThreadPool');
|
||||||
|
expect(displayDetails.cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse static+abstract (*$) attribute with internal visibility', () => {
|
||||||
|
const str = '~pool ThreadPool*$';
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('~pool ThreadPool');
|
||||||
|
expect(displayDetails.cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse abstract+static ($*) attribute name only', () => {
|
||||||
|
const str = 'INSTANCE$*';
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('INSTANCE');
|
||||||
|
expect(displayDetails.cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse static+abstract (*$) attribute name only', () => {
|
||||||
|
const str = 'INSTANCE*$';
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('INSTANCE');
|
||||||
|
expect(displayDetails.cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('Complex attribute type scenarios', () => {
|
||||||
|
it('should parse generic type attribute with static classifier', () => {
|
||||||
|
const str = '+items List~String~$';
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('+items List<String>');
|
||||||
|
expect(displayDetails.cssStyle).toBe(staticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse nested generic type attribute with abstract classifier', () => {
|
||||||
|
const str = '#mapping Map~String, List~Integer~~*';
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('#mapping Map~String, List<Integer~>');
|
||||||
|
expect(displayDetails.cssStyle).toBe(abstractCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse complex generic type with abstract+static classifiers', () => {
|
||||||
|
const str = '+factory Function~Map~String, Object~, Promise~Result~~$*';
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe(
|
||||||
|
'+factory Function<Map>String, Object~, Promise<Result~>'
|
||||||
|
);
|
||||||
|
expect(displayDetails.cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse attribute with spaces in type name', () => {
|
||||||
|
const str = '+fullName Full Name String$';
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('+fullName Full Name String');
|
||||||
|
expect(displayDetails.cssStyle).toBe(staticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse attribute with special characters in name', () => {
|
||||||
|
const str = '+user_name String*';
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('+user_name String');
|
||||||
|
expect(displayDetails.cssStyle).toBe(abstractCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse attribute with numeric suffix', () => {
|
||||||
|
const str = '-value123 int$*';
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('-value123 int');
|
||||||
|
expect(displayDetails.cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@@ -0,0 +1,170 @@
|
|||||||
|
import { describe, it, expect } from 'vitest';
|
||||||
|
import { ClassMember } from './classTypes.js';
|
||||||
|
|
||||||
|
describe('ClassTypes - Enhanced Abstract and Static Combinations', () => {
|
||||||
|
// Test constants to match original test structure
|
||||||
|
const staticCssStyle = 'text-decoration:underline;';
|
||||||
|
const abstractCssStyle = 'font-style:italic;';
|
||||||
|
const abstractStaticCssStyle = 'text-decoration:underline;font-style:italic;';
|
||||||
|
|
||||||
|
describe('Enhanced parseClassifier functionality', () => {
|
||||||
|
describe('when the attribute has static "$" modifier', () => {
|
||||||
|
it('should parse the display text correctly and apply static css style', () => {
|
||||||
|
const str = 'name String$';
|
||||||
|
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('name String');
|
||||||
|
expect(displayDetails.cssStyle).toBe(staticCssStyle);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when the attribute has abstract "*" modifier', () => {
|
||||||
|
it('should parse the display text correctly and apply abstract css style', () => {
|
||||||
|
const str = 'name String*';
|
||||||
|
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('name String');
|
||||||
|
expect(displayDetails.cssStyle).toBe(abstractCssStyle);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when the attribute has abstract static "*$" modifier', () => {
|
||||||
|
it('should parse the display text correctly and apply abstract static css style', () => {
|
||||||
|
const str = 'name String*$';
|
||||||
|
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('name String');
|
||||||
|
expect(displayDetails.cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when the attribute has static abstract "$*" modifier', () => {
|
||||||
|
it('should parse the display text correctly and apply abstract static css style', () => {
|
||||||
|
const str = 'name String$*';
|
||||||
|
|
||||||
|
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
||||||
|
|
||||||
|
expect(displayDetails.displayText).toBe('name String');
|
||||||
|
expect(displayDetails.cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle abstract and static combined (*$) on methods', () => {
|
||||||
|
const str = 'getTime()*$';
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
const details = classMember.getDisplayDetails();
|
||||||
|
|
||||||
|
expect(details.displayText).toBe('getTime()');
|
||||||
|
expect(details.cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle static and abstract combined ($*) on methods', () => {
|
||||||
|
const str = 'getTime()$*';
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
const details = classMember.getDisplayDetails();
|
||||||
|
|
||||||
|
expect(details.displayText).toBe('getTime()');
|
||||||
|
expect(details.cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle abstract and static combined (*$) on attributes', () => {
|
||||||
|
const str = 'data String*$';
|
||||||
|
const classMember = new ClassMember(str, 'attribute');
|
||||||
|
const details = classMember.getDisplayDetails();
|
||||||
|
|
||||||
|
expect(details.displayText).toBe('data String');
|
||||||
|
expect(details.cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle static and abstract combined ($*) on attributes', () => {
|
||||||
|
const str = 'data String$*';
|
||||||
|
const classMember = new ClassMember(str, 'attribute');
|
||||||
|
const details = classMember.getDisplayDetails();
|
||||||
|
|
||||||
|
expect(details.displayText).toBe('data String');
|
||||||
|
expect(details.cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle complex method with abstract static combination', () => {
|
||||||
|
const str = '+processData(Map~String, List~Integer~~) Optional~Result~*$';
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
const details = classMember.getDisplayDetails();
|
||||||
|
|
||||||
|
expect(details.displayText).toBe(
|
||||||
|
'+processData(Map~String, List<Integer~>) : Optional<Result>'
|
||||||
|
);
|
||||||
|
expect(details.cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle attribute with visibility and abstract static combination', () => {
|
||||||
|
const str = '#config Settings$*';
|
||||||
|
const classMember = new ClassMember(str, 'attribute');
|
||||||
|
const details = classMember.getDisplayDetails();
|
||||||
|
|
||||||
|
expect(details.displayText).toBe('#config Settings');
|
||||||
|
expect(details.cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Verify existing classifier functionality still works
|
||||||
|
it('should still handle single static classifier correctly', () => {
|
||||||
|
const str = 'getName()$';
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
const details = classMember.getDisplayDetails();
|
||||||
|
|
||||||
|
expect(details.displayText).toBe('getName()');
|
||||||
|
expect(details.cssStyle).toBe(staticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should still handle single abstract classifier correctly', () => {
|
||||||
|
const str = 'name String*';
|
||||||
|
const classMember = new ClassMember(str, 'attribute');
|
||||||
|
const details = classMember.getDisplayDetails();
|
||||||
|
|
||||||
|
expect(details.displayText).toBe('name String');
|
||||||
|
expect(details.cssStyle).toBe(abstractCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle empty classifier correctly', () => {
|
||||||
|
const str = 'getValue()';
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
const details = classMember.getDisplayDetails();
|
||||||
|
|
||||||
|
expect(details.displayText).toBe('getValue()');
|
||||||
|
expect(details.cssStyle).toBe('');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it('should return correct css for static classifier', function () {
|
||||||
|
const str = `getTime()$`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTime()');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(staticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for abstract classifier', function () {
|
||||||
|
const str = `getTime()*`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTime()');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for abstract static classifier', function () {
|
||||||
|
const str = `getTime()*$`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTime()');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for static abstract classifier', function () {
|
||||||
|
const str = `getTime()$*`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTime()');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
827
packages/mermaid/src/diagrams/class/classTypes.method.spec.ts
Normal file
827
packages/mermaid/src/diagrams/class/classTypes.method.spec.ts
Normal file
@@ -0,0 +1,827 @@
|
|||||||
|
import { ClassMember } from './classTypes.js';
|
||||||
|
import { vi, describe, it, expect } from 'vitest';
|
||||||
|
const spyOn = vi.spyOn;
|
||||||
|
|
||||||
|
const staticCssStyle = 'text-decoration:underline;';
|
||||||
|
const abstractCssStyle = 'font-style:italic;';
|
||||||
|
const abstractStaticCssStyle = 'text-decoration:underline;font-style:italic;';
|
||||||
|
|
||||||
|
describe('given text representing a method, ', function () {
|
||||||
|
describe('when method has no parameters', function () {
|
||||||
|
it('should parse correctly', function () {
|
||||||
|
const str = `getTime()`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe(str);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle public visibility', function () {
|
||||||
|
const str = `+getTime()`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('+getTime()');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle private visibility', function () {
|
||||||
|
const str = `-getTime()`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('-getTime()');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle protected visibility', function () {
|
||||||
|
const str = `#getTime()`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('#getTime()');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle internal visibility', function () {
|
||||||
|
const str = `~getTime()`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('~getTime()');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when method has single parameter value', function () {
|
||||||
|
it('should parse correctly', function () {
|
||||||
|
const str = `getTime(int)`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe(str);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle public visibility', function () {
|
||||||
|
const str = `+getTime(int)`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('+getTime(int)');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle private visibility', function () {
|
||||||
|
const str = `-getTime(int)`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('-getTime(int)');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle protected visibility', function () {
|
||||||
|
const str = `#getTime(int)`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('#getTime(int)');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle internal visibility', function () {
|
||||||
|
const str = `~getTime(int)`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('~getTime(int)');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for static classifier', function () {
|
||||||
|
const str = `getTime(int)$`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTime(int)');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(staticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for abstract classifier', function () {
|
||||||
|
const str = `getTime(int)*`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTime(int)');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for abstract static classifier', function () {
|
||||||
|
const str = `getTime(int)*$`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTime(int)');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for static abstract classifier', function () {
|
||||||
|
const str = `getTime(int)$*`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTime(int)');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when method has single parameter type and name (type first)', function () {
|
||||||
|
it('should parse correctly', function () {
|
||||||
|
const str = `getTime(int count)`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe(str);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle public visibility', function () {
|
||||||
|
const str = `+getTime(int count)`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('+getTime(int count)');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle private visibility', function () {
|
||||||
|
const str = `-getTime(int count)`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('-getTime(int count)');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle protected visibility', function () {
|
||||||
|
const str = `#getTime(int count)`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('#getTime(int count)');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle internal visibility', function () {
|
||||||
|
const str = `~getTime(int count)`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('~getTime(int count)');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for static classifier', function () {
|
||||||
|
const str = `getTime(int count)$`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTime(int count)');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(staticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for abstract classifier', function () {
|
||||||
|
const str = `getTime(int count)*`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTime(int count)');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for abstract static classifier', function () {
|
||||||
|
const str = `getTime(int count)*$`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTime(int count)');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for static abstract classifier', function () {
|
||||||
|
const str = `getTime(int count)$*`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTime(int count)');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when method has single parameter type and name (name first)', function () {
|
||||||
|
it('should parse correctly', function () {
|
||||||
|
const str = `getTime(count int)`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe(str);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle public visibility', function () {
|
||||||
|
const str = `+getTime(count int)`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('+getTime(count int)');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle private visibility', function () {
|
||||||
|
const str = `-getTime(count int)`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('-getTime(count int)');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle protected visibility', function () {
|
||||||
|
const str = `#getTime(count int)`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('#getTime(count int)');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle internal visibility', function () {
|
||||||
|
const str = `~getTime(count int)`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('~getTime(count int)');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for static classifier', function () {
|
||||||
|
const str = `getTime(count int)$`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTime(count int)');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(staticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for abstract classifier', function () {
|
||||||
|
const str = `getTime(count int)*`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTime(count int)');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for abstract static classifier', function () {
|
||||||
|
const str = `getTime(count int)*$`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTime(count int)');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for static abstract classifier', function () {
|
||||||
|
const str = `getTime(count int)$*`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTime(count int)');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when method has multiple parameters', function () {
|
||||||
|
it('should parse correctly', function () {
|
||||||
|
const str = `getTime(string text, int count)`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe(str);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle public visibility', function () {
|
||||||
|
const str = `+getTime(string text, int count)`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe(str);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle private visibility', function () {
|
||||||
|
const str = `-getTime(string text, int count)`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe(str);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle protected visibility', function () {
|
||||||
|
const str = `#getTime(string text, int count)`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe(str);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle internal visibility', function () {
|
||||||
|
const str = `~getTime(string text, int count)`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe(str);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for static classifier', function () {
|
||||||
|
const str = `getTime(string text, int count)$`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTime(string text, int count)');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(staticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for abstract classifier', function () {
|
||||||
|
const str = `getTime(string text, int count)*`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTime(string text, int count)');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for abstract static classifier', function () {
|
||||||
|
const str = `getTime(string text, int count)*$`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTime(string text, int count)');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for static abstract classifier', function () {
|
||||||
|
const str = `getTime(string text, int count)$*`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTime(string text, int count)');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when method has return type', function () {
|
||||||
|
it('should parse correctly', function () {
|
||||||
|
const str = `getTime() DateTime`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTime() : DateTime');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle public visibility', function () {
|
||||||
|
const str = `+getTime() DateTime`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('+getTime() : DateTime');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle private visibility', function () {
|
||||||
|
const str = `-getTime() DateTime`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('-getTime() : DateTime');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle protected visibility', function () {
|
||||||
|
const str = `#getTime() DateTime`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('#getTime() : DateTime');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle internal visibility', function () {
|
||||||
|
const str = `~getTime() DateTime`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('~getTime() : DateTime');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for static classifier', function () {
|
||||||
|
const str = `getTime() DateTime$`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTime() : DateTime');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(staticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for abstract classifier', function () {
|
||||||
|
const str = `getTime() DateTime*`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTime() : DateTime');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for abstract static classifier', function () {
|
||||||
|
const str = `getTime() DateTime*$`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTime() : DateTime');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for static abstract classifier', function () {
|
||||||
|
const str = `getTime() DateTime$*`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTime() : DateTime');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when method parameter is generic', function () {
|
||||||
|
it('should parse correctly', function () {
|
||||||
|
const str = `getTimes(List~T~)`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTimes(List<T>)');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle public visibility', function () {
|
||||||
|
const str = `+getTimes(List~T~)`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('+getTimes(List<T>)');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle private visibility', function () {
|
||||||
|
const str = `-getTimes(List~T~)`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('-getTimes(List<T>)');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle protected visibility', function () {
|
||||||
|
const str = `#getTimes(List~T~)`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('#getTimes(List<T>)');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle internal visibility', function () {
|
||||||
|
const str = `~getTimes(List~T~)`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('~getTimes(List<T>)');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for static classifier', function () {
|
||||||
|
const str = `getTimes(List~T~)$`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTimes(List<T>)');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(staticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for abstract classifier', function () {
|
||||||
|
const str = `getTimes(List~T~)*`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTimes(List<T>)');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for abstract static classifier', function () {
|
||||||
|
const str = `getTimes(List~T~)*$`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTimes(List<T>)');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for static abstract classifier', function () {
|
||||||
|
const str = `getTimes(List~T~)$*`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTimes(List<T>)');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when method parameter contains two generic', function () {
|
||||||
|
it('should parse correctly', function () {
|
||||||
|
const str = `getTimes(List~T~, List~OT~)`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTimes(List<T>, List<OT>)');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle public visibility', function () {
|
||||||
|
const str = `+getTimes(List~T~, List~OT~)`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('+getTimes(List<T>, List<OT>)');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle private visibility', function () {
|
||||||
|
const str = `-getTimes(List~T~, List~OT~)`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('-getTimes(List<T>, List<OT>)');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle protected visibility', function () {
|
||||||
|
const str = `#getTimes(List~T~, List~OT~)`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('#getTimes(List<T>, List<OT>)');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle internal visibility', function () {
|
||||||
|
const str = `~getTimes(List~T~, List~OT~)`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('~getTimes(List<T>, List<OT>)');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for static classifier', function () {
|
||||||
|
const str = `getTimes(List~T~, List~OT~)$`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTimes(List<T>, List<OT>)');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(staticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for abstract classifier', function () {
|
||||||
|
const str = `getTimes(List~T~, List~OT~)*`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTimes(List<T>, List<OT>)');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for abstract static classifier', function () {
|
||||||
|
const str = `getTimes(List~T~, List~OT~)*$`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTimes(List<T>, List<OT>)');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for static abstract classifier', function () {
|
||||||
|
const str = `getTimes(List~T~, List~OT~)$*`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTimes(List<T>, List<OT>)');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when method parameter is a nested generic', function () {
|
||||||
|
it('should parse correctly', function () {
|
||||||
|
const str = `getTimetableList(List~List~T~~)`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTimetableList(List<List<T>>)');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle public visibility', function () {
|
||||||
|
const str = `+getTimetableList(List~List~T~~)`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('+getTimetableList(List<List<T>>)');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle private visibility', function () {
|
||||||
|
const str = `-getTimetableList(List~List~T~~)`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('-getTimetableList(List<List<T>>)');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle protected visibility', function () {
|
||||||
|
const str = `#getTimetableList(List~List~T~~)`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('#getTimetableList(List<List<T>>)');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle internal visibility', function () {
|
||||||
|
const str = `~getTimetableList(List~List~T~~)`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('~getTimetableList(List<List<T>>)');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for static classifier', function () {
|
||||||
|
const str = `getTimetableList(List~List~T~~)$`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTimetableList(List<List<T>>)');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(staticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for abstract classifier', function () {
|
||||||
|
const str = `getTimetableList(List~List~T~~)*`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTimetableList(List<List<T>>)');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for abstract static classifier', function () {
|
||||||
|
const str = `getTimetableList(List~List~T~~)*$`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTimetableList(List<List<T>>)');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for static abstract classifier', function () {
|
||||||
|
const str = `getTimetableList(List~List~T~~)$*`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTimetableList(List<List<T>>)');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when method parameter is a composite generic', function () {
|
||||||
|
const methodNameAndParameters = 'getTimes(List~K, V~)';
|
||||||
|
const expectedMethodNameAndParameters = 'getTimes(List<K, V>)';
|
||||||
|
it('should parse correctly', function () {
|
||||||
|
const str = methodNameAndParameters;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe(expectedMethodNameAndParameters);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle public visibility', function () {
|
||||||
|
const str = '+' + methodNameAndParameters;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe(
|
||||||
|
'+' + expectedMethodNameAndParameters
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle private visibility', function () {
|
||||||
|
const str = '-' + methodNameAndParameters;
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe(
|
||||||
|
'-' + expectedMethodNameAndParameters
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle protected visibility', function () {
|
||||||
|
const str = '#' + methodNameAndParameters;
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe(
|
||||||
|
'#' + expectedMethodNameAndParameters
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle internal visibility', function () {
|
||||||
|
const str = '~' + methodNameAndParameters;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe(
|
||||||
|
'~' + expectedMethodNameAndParameters
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for static classifier', function () {
|
||||||
|
const str = methodNameAndParameters + '$';
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe(expectedMethodNameAndParameters);
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(staticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for abstract classifier', function () {
|
||||||
|
const str = methodNameAndParameters + '*';
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe(expectedMethodNameAndParameters);
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for abstract static classifier', function () {
|
||||||
|
const str = methodNameAndParameters + '*$';
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe(expectedMethodNameAndParameters);
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for static abstract classifier', function () {
|
||||||
|
const str = methodNameAndParameters + '$*';
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe(expectedMethodNameAndParameters);
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when method return type is generic', function () {
|
||||||
|
it('should parse correctly', function () {
|
||||||
|
const str = `getTimes() List~T~`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTimes() : List<T>');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle public visibility', function () {
|
||||||
|
const str = `+getTimes() List~T~`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('+getTimes() : List<T>');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle private visibility', function () {
|
||||||
|
const str = `-getTimes() List~T~`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('-getTimes() : List<T>');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle protected visibility', function () {
|
||||||
|
const str = `#getTimes() List~T~`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('#getTimes() : List<T>');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle internal visibility', function () {
|
||||||
|
const str = `~getTimes() List~T~`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('~getTimes() : List<T>');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for static classifier', function () {
|
||||||
|
const str = `getTimes() List~T~$`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTimes() : List<T>');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(staticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for abstract classifier', function () {
|
||||||
|
const str = `getTimes() List~T~*`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTimes() : List<T>');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for abstract static classifier', function () {
|
||||||
|
const str = `getTimes() List~T~*$`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTimes() : List<T>');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for static abstract classifier', function () {
|
||||||
|
const str = `getTimes() List~T~$*`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getTimes() : List<T>');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when method return type is a nested generic', function () {
|
||||||
|
it('should parse correctly', function () {
|
||||||
|
const str = `getTimetableList() List~List~T~~`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe(
|
||||||
|
'getTimetableList() : List<List<T>>'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle public visibility', function () {
|
||||||
|
const str = `+getTimetableList() List~List~T~~`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe(
|
||||||
|
'+getTimetableList() : List<List<T>>'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle private visibility', function () {
|
||||||
|
const str = `-getTimetableList() List~List~T~~`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe(
|
||||||
|
'-getTimetableList() : List<List<T>>'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle protected visibility', function () {
|
||||||
|
const str = `#getTimetableList() List~List~T~~`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe(
|
||||||
|
'#getTimetableList() : List<List<T>>'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle internal visibility', function () {
|
||||||
|
const str = `~getTimetableList() List~List~T~~`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe(
|
||||||
|
'~getTimetableList() : List<List<T>>'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for static classifier', function () {
|
||||||
|
const str = `getTimetableList() List~List~T~~$`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe(
|
||||||
|
'getTimetableList() : List<List<T>>'
|
||||||
|
);
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(staticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for abstract classifier', function () {
|
||||||
|
const str = `getTimetableList() List~List~T~~*`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe(
|
||||||
|
'getTimetableList() : List<List<T>>'
|
||||||
|
);
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for abstract static classifier', function () {
|
||||||
|
const str = `getTimetableList() List~List~T~~*$`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe(
|
||||||
|
'getTimetableList() : List<List<T>>'
|
||||||
|
);
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should return correct css for static abstract classifier', function () {
|
||||||
|
const str = `getTimetableList() List~List~T~~$*`;
|
||||||
|
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe(
|
||||||
|
'getTimetableList() : List<List<T>>'
|
||||||
|
);
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractStaticCssStyle);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@@ -4,664 +4,9 @@ const spyOn = vi.spyOn;
|
|||||||
|
|
||||||
const staticCssStyle = 'text-decoration:underline;';
|
const staticCssStyle = 'text-decoration:underline;';
|
||||||
const abstractCssStyle = 'font-style:italic;';
|
const abstractCssStyle = 'font-style:italic;';
|
||||||
|
const abstractStaticCssStyle = 'text-decoration:underline;font-style:italic;';
|
||||||
|
|
||||||
describe('given text representing a method, ', function () {
|
describe('given text representing a method, ', function () {
|
||||||
describe('when method has no parameters', function () {
|
|
||||||
it('should parse correctly', function () {
|
|
||||||
const str = `getTime()`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe(str);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle public visibility', function () {
|
|
||||||
const str = `+getTime()`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('+getTime()');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle private visibility', function () {
|
|
||||||
const str = `-getTime()`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('-getTime()');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle protected visibility', function () {
|
|
||||||
const str = `#getTime()`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('#getTime()');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle internal visibility', function () {
|
|
||||||
const str = `~getTime()`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('~getTime()');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return correct css for static classifier', function () {
|
|
||||||
const str = `getTime()$`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('getTime()');
|
|
||||||
expect(classMember.getDisplayDetails().cssStyle).toBe(staticCssStyle);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return correct css for abstract classifier', function () {
|
|
||||||
const str = `getTime()*`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('getTime()');
|
|
||||||
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractCssStyle);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when method has single parameter value', function () {
|
|
||||||
it('should parse correctly', function () {
|
|
||||||
const str = `getTime(int)`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe(str);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle public visibility', function () {
|
|
||||||
const str = `+getTime(int)`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('+getTime(int)');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle private visibility', function () {
|
|
||||||
const str = `-getTime(int)`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('-getTime(int)');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle protected visibility', function () {
|
|
||||||
const str = `#getTime(int)`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('#getTime(int)');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle internal visibility', function () {
|
|
||||||
const str = `~getTime(int)`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('~getTime(int)');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return correct css for static classifier', function () {
|
|
||||||
const str = `getTime(int)$`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('getTime(int)');
|
|
||||||
expect(classMember.getDisplayDetails().cssStyle).toBe(staticCssStyle);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return correct css for abstract classifier', function () {
|
|
||||||
const str = `getTime(int)*`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('getTime(int)');
|
|
||||||
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractCssStyle);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when method has single parameter type and name (type first)', function () {
|
|
||||||
it('should parse correctly', function () {
|
|
||||||
const str = `getTime(int count)`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe(str);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle public visibility', function () {
|
|
||||||
const str = `+getTime(int count)`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('+getTime(int count)');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle private visibility', function () {
|
|
||||||
const str = `-getTime(int count)`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('-getTime(int count)');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle protected visibility', function () {
|
|
||||||
const str = `#getTime(int count)`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('#getTime(int count)');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle internal visibility', function () {
|
|
||||||
const str = `~getTime(int count)`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('~getTime(int count)');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return correct css for static classifier', function () {
|
|
||||||
const str = `getTime(int count)$`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('getTime(int count)');
|
|
||||||
expect(classMember.getDisplayDetails().cssStyle).toBe(staticCssStyle);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return correct css for abstract classifier', function () {
|
|
||||||
const str = `getTime(int count)*`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('getTime(int count)');
|
|
||||||
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractCssStyle);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when method has single parameter type and name (name first)', function () {
|
|
||||||
it('should parse correctly', function () {
|
|
||||||
const str = `getTime(count int)`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe(str);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle public visibility', function () {
|
|
||||||
const str = `+getTime(count int)`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('+getTime(count int)');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle private visibility', function () {
|
|
||||||
const str = `-getTime(count int)`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('-getTime(count int)');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle protected visibility', function () {
|
|
||||||
const str = `#getTime(count int)`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('#getTime(count int)');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle internal visibility', function () {
|
|
||||||
const str = `~getTime(count int)`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('~getTime(count int)');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return correct css for static classifier', function () {
|
|
||||||
const str = `getTime(count int)$`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('getTime(count int)');
|
|
||||||
expect(classMember.getDisplayDetails().cssStyle).toBe(staticCssStyle);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return correct css for abstract classifier', function () {
|
|
||||||
const str = `getTime(count int)*`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('getTime(count int)');
|
|
||||||
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractCssStyle);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when method has multiple parameters', function () {
|
|
||||||
it('should parse correctly', function () {
|
|
||||||
const str = `getTime(string text, int count)`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe(str);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle public visibility', function () {
|
|
||||||
const str = `+getTime(string text, int count)`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe(str);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle private visibility', function () {
|
|
||||||
const str = `-getTime(string text, int count)`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe(str);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle protected visibility', function () {
|
|
||||||
const str = `#getTime(string text, int count)`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe(str);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle internal visibility', function () {
|
|
||||||
const str = `~getTime(string text, int count)`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe(str);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return correct css for static classifier', function () {
|
|
||||||
const str = `getTime(string text, int count)$`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('getTime(string text, int count)');
|
|
||||||
expect(classMember.getDisplayDetails().cssStyle).toBe(staticCssStyle);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return correct css for abstract classifier', function () {
|
|
||||||
const str = `getTime(string text, int count)*`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('getTime(string text, int count)');
|
|
||||||
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractCssStyle);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when method has return type', function () {
|
|
||||||
it('should parse correctly', function () {
|
|
||||||
const str = `getTime() DateTime`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('getTime() : DateTime');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle public visibility', function () {
|
|
||||||
const str = `+getTime() DateTime`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('+getTime() : DateTime');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle private visibility', function () {
|
|
||||||
const str = `-getTime() DateTime`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('-getTime() : DateTime');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle protected visibility', function () {
|
|
||||||
const str = `#getTime() DateTime`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('#getTime() : DateTime');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle internal visibility', function () {
|
|
||||||
const str = `~getTime() DateTime`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('~getTime() : DateTime');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return correct css for static classifier', function () {
|
|
||||||
const str = `getTime() DateTime$`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('getTime() : DateTime');
|
|
||||||
expect(classMember.getDisplayDetails().cssStyle).toBe(staticCssStyle);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return correct css for abstract classifier', function () {
|
|
||||||
const str = `getTime() DateTime*`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('getTime() : DateTime');
|
|
||||||
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractCssStyle);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when method parameter is generic', function () {
|
|
||||||
it('should parse correctly', function () {
|
|
||||||
const str = `getTimes(List~T~)`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('getTimes(List<T>)');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle public visibility', function () {
|
|
||||||
const str = `+getTimes(List~T~)`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('+getTimes(List<T>)');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle private visibility', function () {
|
|
||||||
const str = `-getTimes(List~T~)`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('-getTimes(List<T>)');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle protected visibility', function () {
|
|
||||||
const str = `#getTimes(List~T~)`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('#getTimes(List<T>)');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle internal visibility', function () {
|
|
||||||
const str = `~getTimes(List~T~)`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('~getTimes(List<T>)');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return correct css for static classifier', function () {
|
|
||||||
const str = `getTimes(List~T~)$`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('getTimes(List<T>)');
|
|
||||||
expect(classMember.getDisplayDetails().cssStyle).toBe(staticCssStyle);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return correct css for abstract classifier', function () {
|
|
||||||
const str = `getTimes(List~T~)*`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('getTimes(List<T>)');
|
|
||||||
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractCssStyle);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when method parameter contains two generic', function () {
|
|
||||||
it('should parse correctly', function () {
|
|
||||||
const str = `getTimes(List~T~, List~OT~)`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('getTimes(List<T>, List<OT>)');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle public visibility', function () {
|
|
||||||
const str = `+getTimes(List~T~, List~OT~)`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('+getTimes(List<T>, List<OT>)');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle private visibility', function () {
|
|
||||||
const str = `-getTimes(List~T~, List~OT~)`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('-getTimes(List<T>, List<OT>)');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle protected visibility', function () {
|
|
||||||
const str = `#getTimes(List~T~, List~OT~)`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('#getTimes(List<T>, List<OT>)');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle internal visibility', function () {
|
|
||||||
const str = `~getTimes(List~T~, List~OT~)`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('~getTimes(List<T>, List<OT>)');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return correct css for static classifier', function () {
|
|
||||||
const str = `getTimes(List~T~, List~OT~)$`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('getTimes(List<T>, List<OT>)');
|
|
||||||
expect(classMember.getDisplayDetails().cssStyle).toBe(staticCssStyle);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return correct css for abstract classifier', function () {
|
|
||||||
const str = `getTimes(List~T~, List~OT~)*`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('getTimes(List<T>, List<OT>)');
|
|
||||||
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractCssStyle);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when method parameter is a nested generic', function () {
|
|
||||||
it('should parse correctly', function () {
|
|
||||||
const str = `getTimetableList(List~List~T~~)`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('getTimetableList(List<List<T>>)');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle public visibility', function () {
|
|
||||||
const str = `+getTimetableList(List~List~T~~)`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('+getTimetableList(List<List<T>>)');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle private visibility', function () {
|
|
||||||
const str = `-getTimetableList(List~List~T~~)`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('-getTimetableList(List<List<T>>)');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle protected visibility', function () {
|
|
||||||
const str = `#getTimetableList(List~List~T~~)`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('#getTimetableList(List<List<T>>)');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle internal visibility', function () {
|
|
||||||
const str = `~getTimetableList(List~List~T~~)`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('~getTimetableList(List<List<T>>)');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return correct css for static classifier', function () {
|
|
||||||
const str = `getTimetableList(List~List~T~~)$`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('getTimetableList(List<List<T>>)');
|
|
||||||
expect(classMember.getDisplayDetails().cssStyle).toBe(staticCssStyle);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return correct css for abstract classifier', function () {
|
|
||||||
const str = `getTimetableList(List~List~T~~)*`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('getTimetableList(List<List<T>>)');
|
|
||||||
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractCssStyle);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when method parameter is a composite generic', function () {
|
|
||||||
const methodNameAndParameters = 'getTimes(List~K, V~)';
|
|
||||||
const expectedMethodNameAndParameters = 'getTimes(List<K, V>)';
|
|
||||||
it('should parse correctly', function () {
|
|
||||||
const str = methodNameAndParameters;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe(expectedMethodNameAndParameters);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle public visibility', function () {
|
|
||||||
const str = '+' + methodNameAndParameters;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe(
|
|
||||||
'+' + expectedMethodNameAndParameters
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle private visibility', function () {
|
|
||||||
const str = '-' + methodNameAndParameters;
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe(
|
|
||||||
'-' + expectedMethodNameAndParameters
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle protected visibility', function () {
|
|
||||||
const str = '#' + methodNameAndParameters;
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe(
|
|
||||||
'#' + expectedMethodNameAndParameters
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle internal visibility', function () {
|
|
||||||
const str = '~' + methodNameAndParameters;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe(
|
|
||||||
'~' + expectedMethodNameAndParameters
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return correct css for static classifier', function () {
|
|
||||||
const str = methodNameAndParameters + '$';
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe(expectedMethodNameAndParameters);
|
|
||||||
expect(classMember.getDisplayDetails().cssStyle).toBe(staticCssStyle);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return correct css for abstract classifier', function () {
|
|
||||||
const str = methodNameAndParameters + '*';
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe(expectedMethodNameAndParameters);
|
|
||||||
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractCssStyle);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when method return type is generic', function () {
|
|
||||||
it('should parse correctly', function () {
|
|
||||||
const str = `getTimes() List~T~`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('getTimes() : List<T>');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle public visibility', function () {
|
|
||||||
const str = `+getTimes() List~T~`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('+getTimes() : List<T>');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle private visibility', function () {
|
|
||||||
const str = `-getTimes() List~T~`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('-getTimes() : List<T>');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle protected visibility', function () {
|
|
||||||
const str = `#getTimes() List~T~`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('#getTimes() : List<T>');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle internal visibility', function () {
|
|
||||||
const str = `~getTimes() List~T~`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('~getTimes() : List<T>');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return correct css for static classifier', function () {
|
|
||||||
const str = `getTimes() List~T~$`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('getTimes() : List<T>');
|
|
||||||
expect(classMember.getDisplayDetails().cssStyle).toBe(staticCssStyle);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return correct css for abstract classifier', function () {
|
|
||||||
const str = `getTimes() List~T~*`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe('getTimes() : List<T>');
|
|
||||||
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractCssStyle);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('when method return type is a nested generic', function () {
|
|
||||||
it('should parse correctly', function () {
|
|
||||||
const str = `getTimetableList() List~List~T~~`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe(
|
|
||||||
'getTimetableList() : List<List<T>>'
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle public visibility', function () {
|
|
||||||
const str = `+getTimetableList() List~List~T~~`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe(
|
|
||||||
'+getTimetableList() : List<List<T>>'
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle private visibility', function () {
|
|
||||||
const str = `-getTimetableList() List~List~T~~`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe(
|
|
||||||
'-getTimetableList() : List<List<T>>'
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle protected visibility', function () {
|
|
||||||
const str = `#getTimetableList() List~List~T~~`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe(
|
|
||||||
'#getTimetableList() : List<List<T>>'
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should handle internal visibility', function () {
|
|
||||||
const str = `~getTimetableList() List~List~T~~`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe(
|
|
||||||
'~getTimetableList() : List<List<T>>'
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return correct css for static classifier', function () {
|
|
||||||
const str = `getTimetableList() List~List~T~~$`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe(
|
|
||||||
'getTimetableList() : List<List<T>>'
|
|
||||||
);
|
|
||||||
expect(classMember.getDisplayDetails().cssStyle).toBe(staticCssStyle);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return correct css for abstract classifier', function () {
|
|
||||||
const str = `getTimetableList() List~List~T~~*`;
|
|
||||||
|
|
||||||
const classMember = new ClassMember(str, 'method');
|
|
||||||
expect(classMember.getDisplayDetails().displayText).toBe(
|
|
||||||
'getTimetableList() : List<List<T>>'
|
|
||||||
);
|
|
||||||
expect(classMember.getDisplayDetails().cssStyle).toBe(abstractCssStyle);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('--uncategorized tests--', function () {
|
describe('--uncategorized tests--', function () {
|
||||||
it('member name should handle double colons', function () {
|
it('member name should handle double colons', function () {
|
||||||
const str = `std::map ~int,string~ pMap;`;
|
const str = `std::map ~int,string~ pMap;`;
|
||||||
@@ -680,83 +25,82 @@ describe('given text representing a method, ', function () {
|
|||||||
expect(classMember.getDisplayDetails().cssStyle).toBe(staticCssStyle);
|
expect(classMember.getDisplayDetails().cssStyle).toBe(staticCssStyle);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
|
||||||
|
|
||||||
describe('given text representing an attribute', () => {
|
describe('Edge Cases and Additional Scenarios', () => {
|
||||||
describe('when the attribute has no modifiers', () => {
|
it('should handle method with special characters in name', function () {
|
||||||
it('should parse the display text correctly', () => {
|
const str = `operator++(int value)`;
|
||||||
const str = 'name String';
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('operator++(int value)');
|
||||||
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
expect(classMember.id).toBe('operator++');
|
||||||
|
|
||||||
expect(displayDetails.displayText).toBe('name String');
|
|
||||||
expect(displayDetails.cssStyle).toBe('');
|
|
||||||
});
|
});
|
||||||
});
|
|
||||||
|
|
||||||
describe('when the attribute has public "+" modifier', () => {
|
it('should handle method with numbers in name', function () {
|
||||||
it('should parse the display text correctly', () => {
|
const str = `method123(param)`;
|
||||||
const str = '+name String';
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('method123(param)');
|
||||||
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
expect(classMember.id).toBe('method123');
|
||||||
|
|
||||||
expect(displayDetails.displayText).toBe('+name String');
|
|
||||||
expect(displayDetails.cssStyle).toBe('');
|
|
||||||
});
|
});
|
||||||
});
|
|
||||||
|
|
||||||
describe('when the attribute has protected "#" modifier', () => {
|
it('should handle method with underscores and hyphens', function () {
|
||||||
it('should parse the display text correctly', () => {
|
const str = `get_user_data(user_id int)`;
|
||||||
const str = '#name String';
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('get_user_data(user_id int)');
|
||||||
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
expect(classMember.id).toBe('get_user_data');
|
||||||
|
|
||||||
expect(displayDetails.displayText).toBe('#name String');
|
|
||||||
expect(displayDetails.cssStyle).toBe('');
|
|
||||||
});
|
});
|
||||||
});
|
|
||||||
|
|
||||||
describe('when the attribute has private "-" modifier', () => {
|
it('should handle method with no spaces around parentheses', function () {
|
||||||
it('should parse the display text correctly', () => {
|
const str = `method(param)`;
|
||||||
const str = '-name String';
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('method(param)');
|
||||||
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
|
||||||
|
|
||||||
expect(displayDetails.displayText).toBe('-name String');
|
|
||||||
expect(displayDetails.cssStyle).toBe('');
|
|
||||||
});
|
});
|
||||||
});
|
|
||||||
|
|
||||||
describe('when the attribute has internal "~" modifier', () => {
|
it('should handle method with array parameters', function () {
|
||||||
it('should parse the display text correctly', () => {
|
const str = `processArray(int[] numbers)`;
|
||||||
const str = '~name String';
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('processArray(int[] numbers)');
|
||||||
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
|
||||||
|
|
||||||
expect(displayDetails.displayText).toBe('~name String');
|
|
||||||
expect(displayDetails.cssStyle).toBe('');
|
|
||||||
});
|
});
|
||||||
});
|
|
||||||
|
|
||||||
describe('when the attribute has static "$" modifier', () => {
|
it('should handle method with function pointer parameter', function () {
|
||||||
it('should parse the display text correctly and apply static css style', () => {
|
const str = `callback(void (*fn)(int))`;
|
||||||
const str = 'name String$';
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('callback(void (*fn)(int))');
|
||||||
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
|
||||||
|
|
||||||
expect(displayDetails.displayText).toBe('name String');
|
|
||||||
expect(displayDetails.cssStyle).toBe(staticCssStyle);
|
|
||||||
});
|
});
|
||||||
});
|
|
||||||
|
|
||||||
describe('when the attribute has abstract "*" modifier', () => {
|
it('should handle method with complex nested generics (HTML encoded)', function () {
|
||||||
it('should parse the display text correctly and apply abstract css style', () => {
|
const str = `process(Map<String, List<Map<Integer, String>>> data)`;
|
||||||
const str = 'name String*';
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
// Current behavior: parseGenericTypes converts < > to HTML entities
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('process(Map>> data)');
|
||||||
|
});
|
||||||
|
|
||||||
const displayDetails = new ClassMember(str, 'attribute').getDisplayDetails();
|
it('should handle method with colon in return type', function () {
|
||||||
|
const str = `getNamespace() std::string`;
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('getNamespace() : std::string');
|
||||||
|
});
|
||||||
|
|
||||||
expect(displayDetails.displayText).toBe('name String');
|
it('should handle malformed input gracefully - no parentheses', function () {
|
||||||
expect(displayDetails.cssStyle).toBe(abstractCssStyle);
|
const str = `not_a_method_missing_parentheses`;
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
// This will not match the method regex, so should handle gracefully
|
||||||
|
// But currently throws when parseGenericTypes gets undefined
|
||||||
|
expect(() => classMember.getDisplayDetails()).toThrow();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle empty parameter list with classifier', function () {
|
||||||
|
const str = `emptyMethod()$*`;
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('emptyMethod()');
|
||||||
|
expect(classMember.getDisplayDetails().cssStyle).toBe(
|
||||||
|
'text-decoration:underline;font-style:italic;'
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should handle method with constructor-like name', function () {
|
||||||
|
const str = `Class()`;
|
||||||
|
const classMember = new ClassMember(str, 'method');
|
||||||
|
expect(classMember.getDisplayDetails().displayText).toBe('Class()');
|
||||||
|
expect(classMember.id).toBe('Class');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@@ -81,64 +81,42 @@ export class ClassMember {
|
|||||||
let potentialClassifier = '';
|
let potentialClassifier = '';
|
||||||
|
|
||||||
if (this.memberType === 'method') {
|
if (this.memberType === 'method') {
|
||||||
const methodRegEx = /([#+~-])?(.+)\((.*)\)([\s$*])?(.*)([$*])?/;
|
const methodRegEx = /([#+~-])?(.+)\((.*)\)([$*]{0,2})(.*?)([$*]{0,2})$/;
|
||||||
const match = methodRegEx.exec(input);
|
const match = methodRegEx.exec(input);
|
||||||
if (match) {
|
if (match) {
|
||||||
const detectedVisibility = match[1] ? match[1].trim() : '';
|
this.visibility = (match[1] ? match[1].trim() : '') as Visibility;
|
||||||
|
this.id = match[2].trim();
|
||||||
if (visibilityValues.includes(detectedVisibility)) {
|
|
||||||
this.visibility = detectedVisibility as Visibility;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.id = match[2];
|
|
||||||
this.parameters = match[3] ? match[3].trim() : '';
|
this.parameters = match[3] ? match[3].trim() : '';
|
||||||
potentialClassifier = match[4] ? match[4].trim() : '';
|
potentialClassifier = match[4] ? match[4].trim() : '';
|
||||||
this.returnType = match[5] ? match[5].trim() : '';
|
this.returnType = match[5] ? match[5].trim() : '';
|
||||||
|
|
||||||
if (potentialClassifier === '') {
|
if (potentialClassifier === '') {
|
||||||
const lastChar = this.returnType.substring(this.returnType.length - 1);
|
potentialClassifier = match[6] ? match[6].trim() : '';
|
||||||
if (/[$*]/.exec(lastChar)) {
|
|
||||||
potentialClassifier = lastChar;
|
|
||||||
this.returnType = this.returnType.substring(0, this.returnType.length - 1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
const length = input.length;
|
const fieldRegEx = /([#+~-])?(.*?)([$*]{0,2})$/;
|
||||||
const firstChar = input.substring(0, 1);
|
const match = fieldRegEx.exec(input);
|
||||||
const lastChar = input.substring(length - 1);
|
|
||||||
|
|
||||||
if (visibilityValues.includes(firstChar)) {
|
if (match) {
|
||||||
this.visibility = firstChar as Visibility;
|
this.visibility = (match[1] ? match[1].trim() : '') as Visibility;
|
||||||
|
this.id = match[2] ? match[2].trim() : '';
|
||||||
|
potentialClassifier = match[3] ? match[3].trim() : '';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (/[$*]/.exec(lastChar)) {
|
|
||||||
potentialClassifier = lastChar;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.id = input.substring(
|
|
||||||
this.visibility === '' ? 0 : 1,
|
|
||||||
potentialClassifier === '' ? length : length - 1
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.classifier = potentialClassifier;
|
this.classifier = potentialClassifier;
|
||||||
// Preserve one space only
|
|
||||||
this.id = this.id.startsWith(' ') ? ' ' + this.id.trim() : this.id.trim();
|
|
||||||
|
|
||||||
const combinedText = `${this.visibility ? '\\' + this.visibility : ''}${parseGenericTypes(this.id)}${this.memberType === 'method' ? `(${parseGenericTypes(this.parameters)})${this.returnType ? ' : ' + parseGenericTypes(this.returnType) : ''}` : ''}`;
|
|
||||||
this.text = combinedText.replaceAll('<', '<').replaceAll('>', '>');
|
|
||||||
if (this.text.startsWith('\\<')) {
|
|
||||||
this.text = this.text.replace('\\<', '~');
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
parseClassifier() {
|
parseClassifier() {
|
||||||
switch (this.classifier) {
|
switch (this.classifier) {
|
||||||
case '*':
|
|
||||||
return 'font-style:italic;';
|
|
||||||
case '$':
|
case '$':
|
||||||
return 'text-decoration:underline;';
|
return 'text-decoration:underline;';
|
||||||
|
case '*':
|
||||||
|
return 'font-style:italic;';
|
||||||
|
case '$*':
|
||||||
|
case '*$':
|
||||||
|
return 'text-decoration:underline;font-style:italic;';
|
||||||
default:
|
default:
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
@@ -13,30 +13,6 @@ const getStyles = (options) =>
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.cluster-label text {
|
|
||||||
fill: ${options.titleColor};
|
|
||||||
}
|
|
||||||
.cluster-label span {
|
|
||||||
color: ${options.titleColor};
|
|
||||||
}
|
|
||||||
.cluster-label span p {
|
|
||||||
background-color: transparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cluster rect {
|
|
||||||
fill: ${options.clusterBkg};
|
|
||||||
stroke: ${options.clusterBorder};
|
|
||||||
stroke-width: 1px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cluster text {
|
|
||||||
fill: ${options.titleColor};
|
|
||||||
}
|
|
||||||
|
|
||||||
.cluster span {
|
|
||||||
color: ${options.titleColor};
|
|
||||||
}
|
|
||||||
|
|
||||||
.nodeLabel, .edgeLabel {
|
.nodeLabel, .edgeLabel {
|
||||||
color: ${options.classText};
|
color: ${options.classText};
|
||||||
}
|
}
|
||||||
|
@@ -175,6 +175,7 @@ To describe the visibility (or encapsulation) of an attribute or method/function
|
|||||||
>
|
>
|
||||||
> - `*` Abstract e.g.: `someAbstractMethod()*` or `someAbstractMethod() int*`
|
> - `*` Abstract e.g.: `someAbstractMethod()*` or `someAbstractMethod() int*`
|
||||||
> - `$` Static e.g.: `someStaticMethod()$` or `someStaticMethod() String$`
|
> - `$` Static e.g.: `someStaticMethod()$` or `someStaticMethod() String$`
|
||||||
|
> - `$*` OR `*$` Both e.g: `someAbstractStaticMethod()$*` or `someAbstractStaticMethod() int$*`
|
||||||
|
|
||||||
> _note_ you can also include additional _classifiers_ to a field definition by adding the following notation to the very end:
|
> _note_ you can also include additional _classifiers_ to a field definition by adding the following notation to the very end:
|
||||||
>
|
>
|
||||||
|
@@ -130,6 +130,7 @@ const lollipop = (elem, type, id) => {
|
|||||||
.attr('markerHeight', 240)
|
.attr('markerHeight', 240)
|
||||||
.attr('orient', 'auto')
|
.attr('orient', 'auto')
|
||||||
.append('circle')
|
.append('circle')
|
||||||
|
.attr('stroke', 'black')
|
||||||
.attr('fill', 'transparent')
|
.attr('fill', 'transparent')
|
||||||
.attr('cx', 7)
|
.attr('cx', 7)
|
||||||
.attr('cy', 7)
|
.attr('cy', 7)
|
||||||
@@ -146,6 +147,7 @@ const lollipop = (elem, type, id) => {
|
|||||||
.attr('markerHeight', 240)
|
.attr('markerHeight', 240)
|
||||||
.attr('orient', 'auto')
|
.attr('orient', 'auto')
|
||||||
.append('circle')
|
.append('circle')
|
||||||
|
.attr('stroke', 'black')
|
||||||
.attr('fill', 'transparent')
|
.attr('fill', 'transparent')
|
||||||
.attr('cx', 7)
|
.attr('cx', 7)
|
||||||
.attr('cy', 7)
|
.attr('cy', 7)
|
||||||
|
Reference in New Issue
Block a user