collab/mermaid/cypress/integration/rendering/stateDiagram.spec.jsblame
View source
6dd74de1import { imgSnapshotTest, renderGraph } from '../../helpers/util.ts';
6dd74de2
6dd74de3describe('State diagram', () => {
6dd74de4 it('should render a simple state diagrams', () => {
6dd74de5 imgSnapshotTest(
6dd74de6 `
6dd74de7 stateDiagram
6dd74de8 [*] --> State1
6dd74de9 State1 --> [*]
6dd74de10 `,
6dd74de11 { logLevel: 0, fontFamily: 'courier' }
6dd74de12 );
6dd74de13 });
6dd74de14 it('should render a long descriptions instead of id when available', () => {
6dd74de15 imgSnapshotTest(
6dd74de16 `
6dd74de17 stateDiagram
6dd74de18
6dd74de19 [*] --> S1
6dd74de20 state "Some long name" as S1
6dd74de21 `,
6dd74de22 { logLevel: 0, fontFamily: 'courier' }
6dd74de23 );
6dd74de24 });
6dd74de25 it('should render a long descriptions with additional descriptions', () => {
6dd74de26 imgSnapshotTest(
6dd74de27 `
6dd74de28 stateDiagram
6dd74de29
6dd74de30 [*] --> S1
6dd74de31 state "Some long name" as S1: The description
6dd74de32 `,
6dd74de33 { logLevel: 0, fontFamily: 'courier' }
6dd74de34 );
6dd74de35 });
6dd74de36 it('should render a single state with short descriptions', () => {
6dd74de37 imgSnapshotTest(
6dd74de38 `
6dd74de39 stateDiagram
6dd74de40 state "A long long name" as long1
6dd74de41 state "A" as longlonglongid
6dd74de42 `,
6dd74de43 { logLevel: 0, fontFamily: 'courier' }
6dd74de44 );
6dd74de45 });
6dd74de46 it('should render a transition descriptions with new lines', () => {
6dd74de47 imgSnapshotTest(
6dd74de48 `
6dd74de49 stateDiagram
6dd74de50
6dd74de51 [*] --> S1
6dd74de52 S1 --> S2: long line using<br/>should work
6dd74de53 S1 --> S3: long line using <br>should work
6dd74de54 S1 --> S4: long line using \\nshould work
6dd74de55 `,
6dd74de56 { logLevel: 0, fontFamily: 'courier' }
6dd74de57 );
6dd74de58 });
6dd74de59 it('should render a state with a note', () => {
6dd74de60 imgSnapshotTest(
6dd74de61 `
6dd74de62 stateDiagram
6dd74de63 State1: The state with a note
6dd74de64 note right of State1
6dd74de65 Important information! You can write
6dd74de66 notes.
6dd74de67 end note
6dd74de68 `,
6dd74de69 { logLevel: 0, fontFamily: 'courier' }
6dd74de70 );
6dd74de71 });
6dd74de72 it('should render a state with on the left side when so specified', () => {
6dd74de73 imgSnapshotTest(
6dd74de74 `
6dd74de75 stateDiagram
6dd74de76 State1: The state with a note with minus - and plus + in it
6dd74de77 note left of State1
6dd74de78 Important information! You can write
6dd74de79 notes with . and in them.
6dd74de80 end note
6dd74de81 `,
6dd74de82 { logLevel: 0, fontFamily: 'courier' }
6dd74de83 );
6dd74de84 });
6dd74de85 it('should render a state with a note together with another state', () => {
6dd74de86 imgSnapshotTest(
6dd74de87 `
6dd74de88 stateDiagram
6dd74de89 State1: The state with a note +,-
6dd74de90 note right of State1
6dd74de91 Important information! You can write +,-
6dd74de92 notes.
6dd74de93 end note
6dd74de94 State1 --> State2 : With +,-
6dd74de95 note left of State2 : This is the note +,-<br/>
6dd74de96 `,
6dd74de97 { logLevel: 0, fontFamily: 'courier' }
6dd74de98 );
6dd74de99 });
6dd74de100 it('should render a note with multiple lines in it', () => {
6dd74de101 imgSnapshotTest(
6dd74de102 `
6dd74de103 stateDiagram
6dd74de104 State1: The state with a note
6dd74de105 note right of State1
6dd74de106 Important information! You\ncan write
6dd74de107 notes with multiple lines...
6dd74de108 Here is another line...
6dd74de109 And another line...
6dd74de110 end note
6dd74de111 `,
6dd74de112 { logLevel: 0, fontFamily: 'courier' }
6dd74de113 );
6dd74de114 });
6dd74de115 it('should handle multiline notes with different line breaks', () => {
6dd74de116 imgSnapshotTest(
6dd74de117 `
6dd74de118 stateDiagram
6dd74de119 State1
6dd74de120 note right of State1
6dd74de121 Line1<br>Line2<br/>Line3<br />Line4<br />Line5
6dd74de122 end note
6dd74de123 `,
6dd74de124 { logLevel: 0, fontFamily: 'courier' }
6dd74de125 );
6dd74de126 });
6dd74de127
6dd74de128 it('should render a states with descriptions including multi-line descriptions', () => {
6dd74de129 imgSnapshotTest(
6dd74de130 `
6dd74de131 stateDiagram
6dd74de132 State1: This a single line description
6dd74de133 State2: This a multi line description
6dd74de134 State2: here comes the multi part
6dd74de135 [*] --> State1
6dd74de136 State1 --> State2
6dd74de137 State2 --> [*]
6dd74de138 `,
6dd74de139 { logLevel: 0, fontFamily: 'courier' }
6dd74de140 );
6dd74de141 });
6dd74de142 it('should render a simple state diagrams 2', () => {
6dd74de143 imgSnapshotTest(
6dd74de144 `
6dd74de145 stateDiagram
6dd74de146 [*] --> State1
6dd74de147 State1 --> State2
6dd74de148 State1 --> State3
6dd74de149 State1 --> [*]
6dd74de150 `,
6dd74de151 { logLevel: 0, fontFamily: 'courier' }
6dd74de152 );
6dd74de153 });
6dd74de154 it('should render a simple state diagrams with labels', () => {
6dd74de155 imgSnapshotTest(
6dd74de156 `
6dd74de157 stateDiagram
6dd74de158 [*] --> State1
6dd74de159 State1 --> State2 : Transition 1
6dd74de160 State1 --> State3 : Transition 2
6dd74de161 State1 --> State4 : Transition 3
6dd74de162 State1 --> State5 : Transition 4
6dd74de163 State2 --> State3 : Transition 5
6dd74de164 State1 --> [*]
6dd74de165 `,
6dd74de166 { logLevel: 0, fontFamily: 'courier' }
6dd74de167 );
6dd74de168 });
6dd74de169 it('should render state descriptions', () => {
6dd74de170 imgSnapshotTest(
6dd74de171 `
6dd74de172 stateDiagram
6dd74de173 state "Long state description" as XState1
6dd74de174 state "Another Long state description" as XState2
6dd74de175 XState2 : New line
6dd74de176 XState1 --> XState2
6dd74de177 `,
6dd74de178 { logLevel: 0, fontFamily: 'courier' }
6dd74de179 );
6dd74de180 });
6dd74de181 it('should render composite states', () => {
6dd74de182 imgSnapshotTest(
6dd74de183 `
6dd74de184 stateDiagram
6dd74de185 [*] --> NotShooting: Pacifist
6dd74de186 NotShooting --> A
6dd74de187 NotShooting --> B
6dd74de188 NotShooting --> C
6dd74de189
6dd74de190 state NotShooting {
6dd74de191 [*] --> Idle: Yet another long long öong öong öong label
6dd74de192 Idle --> Configuring : EvConfig
6dd74de193 Configuring --> Idle : EvConfig EvConfig EvConfig EvConfig EvConfig
6dd74de194 }
6dd74de195 `,
6dd74de196 { logLevel: 0, fontFamily: 'courier' }
6dd74de197 );
6dd74de198 });
6dd74de199 it('should render multiple composit states', () => {
6dd74de200 imgSnapshotTest(
6dd74de201 `
6dd74de202 stateDiagram
6dd74de203 [*]-->TV
6dd74de204
6dd74de205 state TV {
6dd74de206 [*] --> Off: Off to start with
6dd74de207 On --> Off : Turn off
6dd74de208 Off --> On : Turn on
6dd74de209 }
6dd74de210
6dd74de211 TV--> Console
6dd74de212
6dd74de213 state Console {
6dd74de214 [*] --> Off2: Off to start with
6dd74de215 On2--> Off2 : Turn off
6dd74de216 Off2 --> On2 : Turn on
6dd74de217 On2-->Playing
6dd74de218
6dd74de219 state Playing {
6dd74de220 Alive --> Dead
6dd74de221 Dead-->Alive
6dd74de222 }
6dd74de223 }
6dd74de224 `,
6dd74de225 { logLevel: 0, fontFamily: 'courier' }
6dd74de226 );
6dd74de227 });
6dd74de228 it('should render forks in composit states', () => {
6dd74de229 imgSnapshotTest(
6dd74de230 `
6dd74de231 stateDiagram
6dd74de232 [*]-->TV
6dd74de233
6dd74de234 state TV {
6dd74de235 state fork_state &lt;&lt;fork&gt;&gt;
6dd74de236 [*] --> fork_state
6dd74de237 fork_state --> State2
6dd74de238 fork_state --> State3
6dd74de239
6dd74de240 state join_state &lt;&lt;join&gt;&gt;
6dd74de241 State2 --> join_state
6dd74de242 State3 --> join_state
6dd74de243 join_state --> State4
6dd74de244 State4 --> [*]
6dd74de245 }
6dd74de246 `,
6dd74de247 { logLevel: 0, fontFamily: 'courier' }
6dd74de248 );
6dd74de249 });
6dd74de250 it('should render forks and joins', () => {
6dd74de251 imgSnapshotTest(
6dd74de252 `
6dd74de253 stateDiagram
6dd74de254 state fork_state &lt;&lt;fork&gt;&gt;
6dd74de255 [*] --> fork_state
6dd74de256 fork_state --> State2
6dd74de257 fork_state --> State3
6dd74de258
6dd74de259 state join_state &lt;&lt;join&gt;&gt;
6dd74de260 State2 --> join_state
6dd74de261 State3 --> join_state
6dd74de262 join_state --> State4
6dd74de263 State4 --> [*]
6dd74de264 `,
6dd74de265 { logLevel: 0, fontFamily: 'courier' }
6dd74de266 );
6dd74de267 });
6dd74de268 it('should render concurrency states', () => {
6dd74de269 imgSnapshotTest(
6dd74de270 `
6dd74de271 stateDiagram
6dd74de272 [*] --> Active
6dd74de273
6dd74de274 state Active {
6dd74de275 [*] --> NumLockOff
6dd74de276 NumLockOff --> NumLockOn : EvNumLockPressed
6dd74de277 NumLockOn --> NumLockOff : EvNumLockPressed
6dd74de278 --
6dd74de279 [*] --> CapsLockOff
6dd74de280 CapsLockOff --> CapsLockOn : EvCapsLockPressed
6dd74de281 CapsLockOn --> CapsLockOff : EvCapsLockPressed
6dd74de282 --
6dd74de283 [*] --> ScrollLockOff
6dd74de284 ScrollLockOff --> ScrollLockOn : EvCapsLockPressed
6dd74de285 ScrollLockOn --> ScrollLockOff : EvCapsLockPressed
6dd74de286 }
6dd74de287 `,
6dd74de288 { logLevel: 0, fontFamily: 'courier' }
6dd74de289 );
6dd74de290 });
6dd74de291 it('should render a state with states in it', () => {
6dd74de292 imgSnapshotTest(
6dd74de293 `
6dd74de294 stateDiagram
6dd74de295 state PilotCockpit {
6dd74de296 state Parent {
6dd74de297 C
6dd74de298 }
6dd74de299 }
6dd74de300 `,
6dd74de301 {
6dd74de302 logLevel: 0,
6dd74de303 fontFamily: 'courier',
6dd74de304 }
6dd74de305 );
6dd74de306 });
6dd74de307 it('Simplest composite state', () => {
6dd74de308 imgSnapshotTest(
6dd74de309 `
6dd74de310 stateDiagram
6dd74de311 state Parent {
6dd74de312 C
6dd74de313 }
6dd74de314 `,
6dd74de315 {
6dd74de316 logLevel: 0,
6dd74de317 fontFamily: 'courier',
6dd74de318 }
6dd74de319 );
6dd74de320 });
6dd74de321 it('should handle multiple arrows from one node to another', () => {
6dd74de322 imgSnapshotTest(
6dd74de323 `
6dd74de324 stateDiagram
6dd74de325 a --> b: Start
6dd74de326 a --> b: Stop
6dd74de327 `,
6dd74de328 {
6dd74de329 logLevel: 0,
6dd74de330 fontFamily: 'courier',
6dd74de331 }
6dd74de332 );
6dd74de333 });
6dd74de334 it('should render a state diagram when useMaxWidth is true (default)', () => {
6dd74de335 renderGraph(
6dd74de336 `
6dd74de337 stateDiagram
6dd74de338 [*] --> State1
6dd74de339 State1 --> [*]
6dd74de340 `,
6dd74de341 { state: { useMaxWidth: true } }
6dd74de342 );
6dd74de343 cy.get('svg').should((svg) => {
6dd74de344 expect(svg).to.have.attr('width', '100%');
6dd74de345 // expect(svg).to.have.attr('height');
6dd74de346 // const height = parseFloat(svg.attr('height'));
6dd74de347 // expect(height).to.be.within(176, 178);
6dd74de348 const style = svg.attr('style');
6dd74de349 expect(style).to.match(/^max-width: [\d.]+px;$/);
6dd74de350 const maxWidthValue = parseFloat(style.match(/[\d.]+/g).join(''));
6dd74de351 // use within because the absolute value can be slightly different depending on the environment ±5%
6dd74de352 // Todo investigate difference
6dd74de353 // expect(maxWidthValue).to.be.within(112 * .95, 112 * 1.05);
6dd74de354 expect(maxWidthValue).to.be.within(65, 85);
6dd74de355 });
6dd74de356 });
6dd74de357 it('should render a state diagram when useMaxWidth is false', () => {
6dd74de358 renderGraph(
6dd74de359 `
6dd74de360 stateDiagram
6dd74de361 [*] --> State1
6dd74de362 State1 --> [*]
6dd74de363 `,
6dd74de364 { state: { useMaxWidth: false } }
6dd74de365 );
6dd74de366 cy.get('svg').should((svg) => {
6dd74de367 // const height = parseFloat(svg.attr('height'));
6dd74de368 const width = parseFloat(svg.attr('width'));
6dd74de369 // expect(height).to.be.within(176, 178);
6dd74de370 // use within because the absolute value can be slightly different depending on the environment ±5%
6dd74de371 // Todo investigate difference
6dd74de372 // expect(width).to.be.within(112 * .95, 112 * 1.05);
6dd74de373 expect(width).to.be.within(65, 85);
6dd74de374
6dd74de375 expect(svg).to.not.have.attr('style');
6dd74de376 });
6dd74de377 });
6dd74de378});