Projekt

Obecné

Profil

« Předchozí | Další » 

Revize 1cc511d8

Přidáno uživatelem Tomáš Šimandl před více než 6 roky(ů)

Repaired Selenium tests

Zobrazit rozdíly:

sources/src/test/java/cz/zcu/kiv/imiger/tests/frontend/ArchetypeIconConfigTest.java
5 5
import org.junit.jupiter.api.BeforeAll;
6 6
import org.junit.jupiter.api.Test;
7 7
import org.openqa.selenium.By;
8
import org.openqa.selenium.NoSuchElementException;
9 8
import org.openqa.selenium.WebDriver;
10 9
import org.openqa.selenium.WebElement;
11
import org.opentest4j.AssertionFailedError;
12 10

  
13
public class ArchetypeIconConfigTest {
14
    static WebDriver browser;
11
class ArchetypeIconConfigTest {
12
    private static WebDriver browser;
15 13

  
16 14
    @BeforeAll
17
    public static void initTest() {
15
    static void initTest() {
18 16
        SeleniumUtil.prepareConfigFile("archetypeIconConfigTest.json");
19 17
        browser = SeleniumUtil.init();
20
        SeleniumUtil.loadGraphData("archetypeIconTest.json");
18
        SeleniumUtil.switchToRaw();
19
        SeleniumUtil.loadGraphData("RawArchetypeIconTest.json");
21 20
    }
22 21

  
23 22
    @Test
24
    public void SpecifiedValueDefinition(){
23
    void SpecifiedValueDefinition(){
25 24
        WebElement iconDef = browser.findElement(By.id("vertexArchetypeIcon-SpecifiedIcon"));
26 25

  
27 26
        System.out.println("Trying to locate an element with class 'testingArchetypeIcon'");
......
30 29
    }
31 30

  
32 31
    @Test
33
    public void UnspecifiedValueDefinition(){
32
    void UnspecifiedValueDefinition(){
34 33
        emptyIconDefinition("UnspecifiedIcon");
35 34
    }
36 35

  
37 36
    @Test
38
    public void SmileyValueDefinition(){
37
    void SmileyValueDefinition(){
39 38
        emptyIconDefinition("☺Smiley");
40 39
    }
41 40

  
42 41
    @Test
43
    public void SpecifiedIcon(){
42
    void SpecifiedIcon(){
44 43
        locateTestingArchetypeIcon("1","#vertexArchetypeIcon-SpecifiedIcon");
45 44
    }
46 45

  
47 46
    @Test
48
    public void UnspecifiedIcon(){
47
    void UnspecifiedIcon(){
49 48
        locateTestingArchetypeIcon("2","#vertexArchetypeIcon-UnspecifiedIcon");
50 49
    }
51 50

  
52 51
    @Test
53
    public void SmileyIcon(){
52
    void SmileyIcon(){
54 53
        locateTestingArchetypeIcon("3","#vertexArchetypeIcon-☺Smiley");
55 54
    }
56 55

  
......
76 75
    }
77 76

  
78 77
    @AfterAll
79
    public static void finishTest() {
78
    static void finishTest() {
80 79
        SeleniumUtil.clear();
81 80
    }
82 81
}
sources/src/test/java/cz/zcu/kiv/imiger/tests/frontend/AssociatedArchetypeTest.java
5 5
import org.junit.jupiter.api.BeforeAll;
6 6
import org.junit.jupiter.api.Test;
7 7
import org.openqa.selenium.By;
8
import org.openqa.selenium.NoSuchElementException;
9 8
import org.openqa.selenium.WebDriver;
10 9
import org.openqa.selenium.WebElement;
11 10

  
12 11
import java.util.Arrays;
13 12
import java.util.List;
14 13

  
15
/*
16
 * Tests are not working because new graph is out of actual visible view.
17
 */
18
public class AssociatedArchetypeTest {
19
    static WebDriver browser;
14

  
15
class AssociatedArchetypeTest {
16
    private static WebDriver browser;
20 17

  
21 18
    @BeforeAll
22
    public static void initTest() {
19
    static void initTest() {
23 20
        SeleniumUtil.prepareConfigFile("emptyConfig.json");
24 21
        browser = SeleniumUtil.init();
25
        SeleniumUtil.loadGraphData("associatedArchetypeTest.json");
22
        SeleniumUtil.switchToRaw();
23
        SeleniumUtil.loadGraphData("RawAssociatedArchetypeTest.json");
26 24
    }
27 25

  
28 26
    @Test
29
    public void visibilityOfAllIcons() {
27
    void visibilityOfAllIcons() {
30 28
        checkVisibilityOfIcons("1", Arrays.asList("2", "4"), Arrays.asList("2", "4"));
31 29

  
32 30
        checkVisibilityOfIcons("2", Arrays.asList("1"), Arrays.asList("1"));
......
39 37
    }
40 38

  
41 39
    @Test
42
    public void vertexHighlighting() {
40
    void vertexHighlighting() {
43 41
        //associated vertices to V1
44 42
        checkHighlightedVertices("1", "2", Arrays.asList("2", "3"));
45 43
        checkHighlightedVertices("1", "4", Arrays.asList("4"));
......
131 129
    }
132 130

  
133 131
    @AfterAll
134
    public static void finishTest() {
132
    static void finishTest() {
135 133
        SeleniumUtil.clear();
136 134
    }
137 135
}
sources/src/test/java/cz/zcu/kiv/imiger/tests/frontend/AutomaticGroupingTest.java
8 8
import java.util.ArrayList;
9 9
import java.util.List;
10 10

  
11
public class AutomaticGroupingTest {
12
    static WebDriver browser;
11
class AutomaticGroupingTest {
12
    private static WebDriver browser;
13 13

  
14 14
    @BeforeEach
15
    public void initTest() {
15
    void initTest() {
16 16
        SeleniumUtil.prepareConfigFile("automaticGroupingConfigTest.json");
17 17
        browser = SeleniumUtil.init();
18 18
        SeleniumUtil.loadGraphData("automaticGroupingTest.json");
19 19
    }
20 20

  
21 21
    @Test
22
    public void groupIncluded(){
22
    void groupIncluded(){
23 23
        String groupName = "FirstGroupArchetype";
24 24
        checkGroupExist(browser, groupName);
25 25
    }
26 26

  
27 27
    @Test
28
    public void groupExcluded(){
28
    void groupExcluded(){
29 29
        String groupName = "FirstGroupArchetype";
30 30
        List<String> verticesNames = new ArrayList<>();
31 31
        verticesNames.add("First vertex from first group");
......
64 64
    }
65 65

  
66 66
    private void excludeFirstGroup(WebDriver browser){
67
        List<WebElement> navList = browser.findElement(By.tagName("nav")).findElements(By.tagName("ul"));
68

  
69
        for( WebElement item : navList){
70
            WebElement form = item.findElement(By.tagName("form"));
71
            if (form != null){
72
                String formName = form.getAttribute("name");
73
                if (formName.equals("actionForm")) {
74
                    item.findElements(By.tagName("label")).get(1).click();
75
                    break;
76
                }
77
            }
78
        }
67
        SeleniumUtil.switchToExcludeMode();
79 68

  
80 69
        List<WebElement> groups = browser.findElement(By.cssSelector("[data-id='groups']"))
81 70
                .findElements(By.className("node"));
82 71

  
83
        groups.get(0).findElement(By.tagName("rect")).click();
84
        try {
85
            Thread.sleep(1000);
86
        } catch (InterruptedException e) {
87
            e.printStackTrace();
88
        }
72
        SeleniumUtil.svgRectClick(groups.get(0));
89 73
    }
90 74

  
91 75
    @AfterEach
92
    public void finishTest() {
76
    void finishTest() {
93 77
        SeleniumUtil.clear();
94 78
    }
95 79
}
sources/src/test/java/cz/zcu/kiv/imiger/tests/frontend/DetailsTest.java
8 8
import org.openqa.selenium.WebDriver;
9 9
import org.openqa.selenium.WebElement;
10 10

  
11
public class DetailsTest {
11
class DetailsTest {
12 12

  
13
    static WebDriver browser;
13
    private static WebDriver browser;
14 14

  
15 15
    @BeforeAll
16
    public static void initTest() {
16
    static void initTest() {
17 17
        SeleniumUtil.prepareConfigFile("emptyConfig.json");
18 18
        browser = SeleniumUtil.init();
19
        SeleniumUtil.loadGraphData("detailTest.json");
19
        SeleniumUtil.switchToRaw();
20
        SeleniumUtil.loadGraphData("RawDetailTest.json");
20 21
    }
21 22

  
22 23
    @Test
23
    public void vertexDetail(){
24
    void vertexDetail(){
24 25
        checkPopover(vertexPopover("V1"),"V1 (3)\nD: E\nB: W\nA: Q");
25 26

  
26 27
        checkPopover(vertexPopover("V2"),"V2 (2)\nD: E\nC: Q\nB: W");
......
29 30
    }
30 31

  
31 32
    @Test
32
    public void edgeDetail() {
33
    void edgeDetail() {
33 34
        checkPopover(edgePopover("1"),"Edge details\nedgeArchetype1\nD: E\nC: W");
34 35

  
35 36
        checkPopover(edgePopover("2"),"Edge details\nedgeArchetype1\nD: E\nB: W\nA: Q\nedgeArchetype2\nD: D\nB: S\nA: A");
......
43 44
                .findElement(By.cssSelector("[data-id='" + edgeId + "']"))
44 45
                .findElement(By.className("arrow"));
45 46

  
46
        SeleniumUtil.svgClick(arrow);
47
        SeleniumUtil.svgClickWithOffset(arrow, 3, 0);
47 48
        return browser.findElement(By.className("edge-popover"));
48 49
    }
49 50

  
......
62 63
    }
63 64

  
64 65
    @AfterAll
65
    public static void finishTest() {
66
    static void finishTest() {
66 67
        SeleniumUtil.clear();
67 68
    }
68 69
}
sources/src/test/java/cz/zcu/kiv/imiger/tests/frontend/GroupStatsChangingTest.java
8 8
import org.openqa.selenium.WebDriver;
9 9
import org.openqa.selenium.WebElement;
10 10

  
11
import java.util.ArrayList;
12
import java.util.Arrays;
13
import java.util.List;
11
import java.util.*;
14 12

  
15
public class GroupStatsChangingTest {
16
    static WebDriver browser;
13
class GroupStatsChangingTest {
14
    private static WebDriver browser;
17 15

  
18 16
    @BeforeAll
19
    public static void initTest() {
17
    static void initTest() {
20 18
        SeleniumUtil.prepareConfigFile("emptyConfig.json");
21 19
        browser = SeleniumUtil.init();
22
        SeleniumUtil.loadGraphData("associatedArchetypeTest.json");
23
        for(int i = 0; i<=5;i++)
24
            SeleniumUtil.svgClick(browser.findElement(By.id("zoomOut")));
20
        SeleniumUtil.switchToRaw();
21
        SeleniumUtil.loadGraphData("RawAssociatedArchetypeTest.json");
25 22
    }
26 23

  
27 24
    @Test
28
    public void ChangingStats() {
29
        String groupId = "";
30
        switchExludeMode();
31
        WebElement firstEcludedVertex = browser.findElement(By.id("vertex3"));
25
    void ChangingStats() {
26
        String groupId;
27
        SeleniumUtil.switchToExcludeMode();
28
        WebElement firstExcludedVertex = browser.findElement(By.cssSelector("[data-id='vertices']"))
29
                .findElement(By.cssSelector("[data-id='3']"));
32 30

  
33
        SeleniumUtil.svgClick(firstEcludedVertex);
31
        SeleniumUtil.svgRectClick(firstExcludedVertex);
34 32
        System.out.println("Exclude vertex3 to group as first vertex of group");
35 33

  
36
        excludeToExistingGroup("vertex2");
34
        excludeToExistingGroup("2");
37 35
        System.out.println("Exclude vertex2 to group");
38 36

  
39 37
        //get data-id of fgroup
40
        groupId = browser.findElement(By.className("group_vertices")).getAttribute("data-id");
41

  
42
        compareExpectedValues(groupId, new ArrayList<String>(Arrays.asList("2","0","0","0")));
43

  
44
        excludeToExistingGroup("vertex1");
45
        compareExpectedValues(groupId, new ArrayList<String>(Arrays.asList("2","2","0","2")));
46
        System.out.println("Exclude vertex1 to group");
47

  
48
        System.out.println("Remove vertex2 to group");
49
        removeVertexFromGroup("li2");
50
        compareExpectedValues(groupId, new ArrayList<String>(Arrays.asList("1","2","0","2")));
51

  
52
        System.out.println("Switch off stats for vertex1");
53
        toogleVertexInGroup("li1");
54
        compareExpectedValues(groupId, new ArrayList<String>(Arrays.asList("1","0","0","0")));
55

  
56
        System.out.println("Switch off stats for vertex3");
57
        toogleVertexInGroup("li3");
58
        compareExpectedValues(groupId, new ArrayList<String>(Arrays.asList("0","0","0","0")));
59

  
60
        System.out.println("Switch on stats for vertex1");
61
        toogleVertexInGroup("li3");
62
        excludeToExistingGroup("vertex2");
63
        compareExpectedValues(groupId, new ArrayList<String>(Arrays.asList("2","0","0","0")));
64

  
65
        //finaly test just one vertex in group
66
        String archetypePrefix = "v_archetype_4_";
67
        switchExludeMode();
68
        WebElement singleEcludedVertex = browser.findElement(By.id("vertex4"));
69
        System.out.println("Exclude vertex4 to group as first vertex of group");
70
        SeleniumUtil.svgClick(singleEcludedVertex);
71

  
72
        System.out.println("Checking group statistics");
73
        String actualValue1 = browser.findElement(By.id(archetypePrefix + "0")).findElement(By.tagName("text")).getText();
74
        String actualValue2 = browser.findElement(By.id(archetypePrefix + "2")).findElement(By.tagName("text")).getText();
75
        Assertions.assertEquals(actualValue1, "2");
76
        Assertions.assertEquals(actualValue2, "1");
77

  
78
        System.out.println("Expected: 2 - Real: " + actualValue1);
79
        System.out.println("Expected: 1 - Real: " + actualValue2);
38
        groupId = browser.findElement(By.id("excludedNodeListComponent"))
39
                .findElement(By.className("node")).getAttribute("data-id");
40

  
41
        Map<String, String> map = new HashMap<>();
42
        map.put("1", "2");
43
        map.put("3", "1");
44
        compareExpectedValues(groupId, map);
45

  
46
//        EXCLUDING VERTICES FROM GROUPS IS NOT SUPPORTED YET
47
//        excludeToExistingGroup("1");
48
//        compareExpectedValues(groupId, new ArrayList<String>(Arrays.asList("2","2","0","2")));
49
//        System.out.println("Exclude vertex1 to group");
50
//
51
//        System.out.println("Remove vertex2 to group");
52
//        removeVertexFromGroup("li2");
53
//        compareExpectedValues(groupId, new ArrayList<String>(Arrays.asList("1","2","0","2")));
54
//
55
//        System.out.println("Switch off stats for vertex1");
56
//        toogleVertexInGroup("li1");
57
//        compareExpectedValues(groupId, new ArrayList<String>(Arrays.asList("1","0","0","0")));
58
//
59
//        System.out.println("Switch off stats for vertex3");
60
//        toogleVertexInGroup("li3");
61
//        compareExpectedValues(groupId, new ArrayList<String>(Arrays.asList("0","0","0","0")));
62
//
63
//        System.out.println("Switch on stats for vertex1");
64
//        toogleVertexInGroup("li3");
65
//        excludeToExistingGroup("vertex2");
66
//        compareExpectedValues(groupId, new ArrayList<String>(Arrays.asList("2","0","0","0")));
67
//
68
//        //finaly test just one vertex in group
69
//        String archetypePrefix = "v_archetype_4_";
70
//        SeleniumUtil.switchToExcludeMode();
71
//        WebElement singleEcludedVertex = browser.findElement(By.id("vertex4"));
72
//        System.out.println("Exclude vertex4 to group as first vertex of group");
73
//        SeleniumUtil.svgClick(singleEcludedVertex);
74
//
75
//        System.out.println("Checking group statistics");
76
//        String actualValue1 = browser.findElement(By.id(archetypePrefix + "0")).findElement(By.tagName("text")).getText();
77
//        String actualValue2 = browser.findElement(By.id(archetypePrefix + "2")).findElement(By.tagName("text")).getText();
78
//        Assertions.assertEquals(actualValue1, "2");
79
//        Assertions.assertEquals(actualValue2, "1");
80
//
81
//        System.out.println("Expected: 2 - Real: " + actualValue1);
82
//        System.out.println("Expected: 1 - Real: " + actualValue2);
80 83

  
81 84
    }
82 85

  
83
    /**
84
     * Turn on exclude mode for vertex exclude
85
     */
86
    private void switchExludeMode(){
87
        browser.findElement(By.id("remove")).click();
88
        try {
89
            Thread.sleep(1000);
90
        } catch (InterruptedException e) {
91
            e.printStackTrace();
92
        }
93
    }
94

  
95 86
    /**
96 87
     * Exclude vertex from graph to group
97 88
     * @param vertexId id of vertex to exclude
98 89
     */
99 90
    private void excludeToExistingGroup(String vertexId){
100
        WebElement secondExcludedVertex = browser.findElement(By.id(vertexId));
101
        SeleniumUtil.svgContexClick(secondExcludedVertex);
102
        WebElement selectedGroup = browser.findElement(By.className("component_color"));
103
        SeleniumUtil.svgClick(selectedGroup);
91
        WebElement secondExcludedVertex = browser.findElement(By.cssSelector("[data-id='vertices']"))
92
                .findElement(By.cssSelector("[data-id='" + vertexId + "']"));
93

  
94
        SeleniumUtil.svgContextClick(secondExcludedVertex.findElement(By.tagName("rect")));
95
        WebElement selectedGroup = browser.findElement(By.className("context-menu")).findElements(By.tagName("li")).get(0);
96
        selectedGroup.click();
104 97
    }
105 98

  
106 99
    /**
......
126 119
     * @param groupId id of group
127 120
     * @param expectedValues list of expected values
128 121
     */
129
    private void compareExpectedValues(String groupId, ArrayList<String> expectedValues){
122
    private void compareExpectedValues(String groupId, Map<String, String> expectedValues){
130 123
        System.out.println("Checking group statistics");
131
        String archetypePrefix = "g_archetype_" + groupId + "_";
124
        String archetypePrefix = "#vertexArchetypeIcon-";
132 125

  
133
        List<String> actualValues = new ArrayList<String>();
126
        WebElement nodeList = browser.findElement(By.id("excludedNodeListComponent"))
127
                .findElement(By.className("node-list"));
134 128

  
135
        for(int i = 0; i< expectedValues.size(); i++) {
136
            String archetypePos = i+"";
137
            String actualValue = browser.findElement(By.id(archetypePrefix + archetypePos)).findElement(By.tagName("text")).getText();
138
            actualValues.add(actualValue);
139
        }
129
        for (String key : expectedValues.keySet()) {
130

  
131
            List<WebElement> gList = nodeList.findElement(By.cssSelector("[href='" + archetypePrefix + key + "']"))
132
                    .findElements(By.xpath("//parent::*[name()='g']"));
133

  
134

  
135
            String actualValue = gList.get(gList.size() - 1)
136
                    .findElement(By.tagName("text")).getText();
140 137

  
141
        for(int i = 0; i< expectedValues.size(); i++) {
142
            Assertions.assertEquals(actualValues.get(i), expectedValues.get(i));
143
            System.out.println("Expected: " + expectedValues.get(i) + " - Real: " + actualValues.get(i));
138
            Assertions.assertEquals(actualValue, expectedValues.get(key));
144 139
        }
145 140
    }
146 141

  
147 142
    @AfterAll
148
    public static void finishTest() {
143
    static void finishTest() {
149 144
        SeleniumUtil.clear();
150 145
    }
151 146
}
sources/src/test/java/cz/zcu/kiv/imiger/tests/frontend/SeleniumUtil.java
12 12
import java.nio.file.Files;
13 13
import java.nio.file.Paths;
14 14

  
15
public class SeleniumUtil {
15
class SeleniumUtil {
16 16

  
17 17
    private static final String TEST_DIRECTORY = System.getProperty("user.dir") + "\\..\\test";
18 18

  
......
31 31

  
32 32
    private static WebDriver browser;
33 33

  
34
    public static WebDriver init() {
34
    static WebDriver init() {
35 35
        System.setProperty("webdriver.gecko.driver", GECKO_PATH);
36 36
        browser = new FirefoxDriver();
37 37
        browser.get(URL);
38 38
        return browser;
39 39
    }
40 40

  
41
    public static void loadGraphData(String filename) {
41
    static void loadGraphData(String filename) {
42 42
        WebElement fileInput = browser.findElement(By.id("file"));
43 43
        fileInput.sendKeys(TEST_DIRECTORY + "\\data\\" + filename );
44 44
        browser.findElement(By.id("btnLoad")).click();
......
53 53
        }
54 54
    }
55 55

  
56
    public static void prepareConfigFile(String configFile) {
56
    static void prepareConfigFile(String configFile) {
57 57
        try {
58 58
            Files.deleteIfExists(Paths.get(APP_CONFIG_LOCATION + "\\config.json"));
59 59
            Files.createLink(Paths.get(APP_CONFIG_LOCATION + "\\config.json"),
......
63 63
        }
64 64
    }
65 65

  
66
    public static void svgClick(WebElement toClick) {
66
    static void switchToRaw(){
67
        browser.findElement(By.id("raw")).click();
68
    }
69

  
70
    /**
71
     * Turn on exclude mode for vertex exclude
72
     */
73
    static void switchToExcludeMode(){
74
        browser.findElement(By.id("remove")).click();
75

  
76
        try {
77
            Thread.sleep(1000);
78
        } catch (InterruptedException e) {
79
            e.printStackTrace();
80
        }
81
    }
82

  
83
    static void svgRectClick(WebElement toClick){
84
        toClick.findElement(By.tagName("rect")).click();
85

  
86
        try {
87
            Thread.sleep(1000);
88
        } catch (InterruptedException e) {
89
            e.printStackTrace();
90
        }
91
    }
92

  
93
    static void svgRectContextClick(WebElement toClick){
94
        Actions builder = new Actions(browser);
95
        builder.contextClick(toClick.findElement(By.tagName("rect"))).build().perform();
96

  
97
        try {
98
            Thread.sleep(1000);
99
        } catch (InterruptedException e) {
100
            e.printStackTrace();
101
        }
102
    }
103

  
104
    static void svgClick(WebElement toClick) {
105
        svgClickWithOffset(toClick, 0, 0);
106
    }
107

  
108
    static void svgClickWithOffset(WebElement toClick, int xOffset, int yOffset) {
67 109
        Actions builder = new Actions(browser);
68
        builder.click(toClick).build().perform();
110
        builder.moveToElement(toClick).moveByOffset(xOffset,yOffset).click().build().perform();
69 111

  
70 112
        try {
71 113
            Thread.sleep(1000);
......
78 120
     * Right mouse click
79 121
     * @param toClick element for click
80 122
     */
81
    public static void svgContexClick(WebElement toClick) {
123
    static void svgContextClick(WebElement toClick) {
82 124
        Actions builder = new Actions(browser);
83
        builder.contextClick(toClick).build().perform();
125
        builder.moveToElement(toClick).contextClick().build().perform();
84 126

  
85 127
        try {
86 128
            Thread.sleep(1000);
......
89 131
        }
90 132
    }
91 133

  
92
    public static void clear() {
134
    static void clear() {
93 135
        browser.close();
94 136
    }
95 137
}
test/data/RawArchetypeIconTest.json
1
{"attributeTypes":[],"edgeArchetypes":[{"name":"edge","text":""}],"vertexArchetypes":[{"icon":"<rect class=\"testingArchetypeIcon\" width=\"12\" height=\"15\" x=\"0\" y =\"0\" stroke=\"none\" fill=\"green\"/>","name":"SpecifiedIcon","text":""},{"icon":"","name":"UnspecifiedIcon","text":""},{"icon":"","name":"☺Smiley","text":""}],"vertices":[{"archetype":0,"attributes":[],"id":1,"text":"","name":"Vertex with specified icon","position":{"x":640.5,"y":408.25}},{"archetype":1,"attributes":[],"id":2,"text":"","name":"Vertex with unspecified icon","position":{"x":826.25,"y":536.75}},{"archetype":2,"attributes":[],"id":3,"text":"","name":"Vertex with smiley as archetype icon","position":{"x":438,"y":537.75}}],"edges":[{"subedgeInfo":[{"archetype":0,"attributes":[],"id":1}],"from":1,"to":3,"text":"","id":1},{"subedgeInfo":[{"archetype":0,"attributes":[],"id":0}],"from":1,"to":2,"text":"","id":2}],"possibleEnumValues":{},"groups":[],"sideBar":[],"highlightedVertex":"","highlightedEdge":""}
test/data/RawAssociatedArchetypeTest.json
1
{"attributeTypes":[],"edgeArchetypes":[{"name":"edge","text":""}],"vertexArchetypes":[{"icon":"","name":"1","text":""},{"icon":"","name":"2","text":""},{"icon":"","name":"3","text":""},{"icon":"","name":"4","text":""}],"vertices":[{"archetype":0,"attributes":[],"id":1,"text":"","name":"V1","position":{"x":989.5,"y":684}},{"archetype":1,"attributes":[],"id":2,"text":"","name":"V2","position":{"x":985.75,"y":871.5}},{"archetype":1,"attributes":[],"id":3,"text":"","name":"V3","position":{"x":988,"y":540}},{"archetype":3,"attributes":[],"id":4,"text":"","name":"V4","position":{"x":694,"y":678.25}},{"archetype":2,"attributes":[],"id":5,"text":"","name":"V5","position":{"x":702.75,"y":755}}],"edges":[{"subedgeInfo":[{"archetype":0,"attributes":[],"id":0}],"from":1,"to":2,"text":"","id":1},{"subedgeInfo":[{"archetype":0,"attributes":[],"id":4}],"from":4,"to":5,"text":"","id":2},{"subedgeInfo":[{"archetype":0,"attributes":[],"id":2}],"from":1,"to":4,"text":"","id":3},{"subedgeInfo":[{"archetype":0,"attributes":[],"id":1}],"from":3,"to":1,"text":"","id":4},{"subedgeInfo":[{"archetype":0,"attributes":[],"id":3}],"from":4,"to":1,"text":"","id":5}],"possibleEnumValues":{},"groups":[],"sideBar":[],"highlightedVertex":"","highlightedEdge":""}
test/data/RawDetailTest.json
1
{"attributeTypes":[{"dataType":"STRING","name":"D","text":"0"},{"dataType":"STRING","name":"C","text":"1"},{"dataType":"STRING","name":"B","text":"2"},{"dataType":"STRING","name":"A","text":"3"}],"edgeArchetypes":[{"name":"edgeArchetype1","text":""},{"name":"edgeArchetype2","text":""}],"vertexArchetypes":[{"icon":"","name":"1","text":""},{"icon":"","name":"2","text":""},{"icon":"","name":"3","text":""}],"vertices":[{"archetype":2,"attributes":[["D","E"],["B","W"],["A","Q"]],"id":1,"text":"","name":"V1","position":{"x":753.25,"y":693.75}},{"archetype":1,"attributes":[["D","E"],["C","Q"],["B","W"]],"id":2,"text":"","name":"V2","position":{"x":534.25,"y":897.5}},{"archetype":0,"attributes":[["D","Q"],["C","W"],["A","E"]],"id":3,"text":"","name":"V3","position":{"x":961.25,"y":899.75}}],"edges":[{"subedgeInfo":[{"archetype":0,"attributes":[["D","E"],["C","W"]],"id":3}],"from":1,"to":3,"text":"","id":1},{"subedgeInfo":[{"archetype":0,"attributes":[["D","E"],["B","W"],["A","Q"]],"id":1},{"archetype":1,"attributes":[["D","D"],["B","S"],["A","A"]],"id":2}],"from":1,"to":2,"text":"","id":2},{"subedgeInfo":[{"archetype":1,"attributes":[["C","T"],["B","R"]],"id":4}],"from":3,"to":1,"text":"","id":3}],"possibleEnumValues":{},"groups":[],"sideBar":[],"highlightedVertex":"","highlightedEdge":""}
test/data/archetypeIconTest.json
1
{
2
 "attributeTypes": [
3

  
4
 ],
5
 "vertexArchetypes": [
6
  {
7
   "name": "SpecifiedIcon",
8
   "text": ""
9
  },
10
  {
11
   "name": "UnspecifiedIcon",
12
   "text": ""
13
  },
14
  {
15
   "name": "☺Smiley",
16
   "text": ""
17
  }
18
 ],
19
 "edgeArchetypes": [
20
	{
21
		"name": "edge",
22
		"text": ""
23
	}
24
 ],
25
 "vertices": [
26
  {
27
   "archetype": 0,
28
   "attributes": {},
29
   "id": 1,
30
   "text": "",
31
   "title": "Vertex with specified icon"
32
  },
33
  {
34
   "archetype": 1,
35
   "attributes": {},
36
   "id": 2,
37
   "text": "",
38
   "title": "Vertex with unspecified icon"
39
  },
40
  {
41
   "archetype": 2,
42
   "attributes": {},
43
   "id": 3,
44
   "text": "",
45
   "title": "Vertex with smiley as archetype icon"
46
  }
47
 ],
48
 "edges": [
49
	{
50
	   "archetype": 0,
51
	   "from": 1,
52
	   "attributes": {},
53
	   "id": 0,
54
	   "to": 2,
55
	   "text": ""
56
	},
57
	{
58
	   "archetype": 0,
59
	   "from": 1,
60
	   "attributes": {},
61
	   "id": 1,
62
	   "to": 3,
63
	   "text": ""
64
	}
65
 ]
66
}
test/data/associatedArchetypeTest.json
1
{
2
 "attributeTypes": [
3

  
4
 ],
5
 "vertexArchetypes": [
6
  {
7
   "name": "1",
8
   "text": ""
9
  },
10
  {
11
   "name": "2",
12
   "text": ""
13
  },
14
  {
15
   "name": "3",
16
   "text": ""
17
  },
18
  {
19
   "name": "4",
20
   "text": ""
21
  }
22
 ],
23
 "edgeArchetypes": [
24
	{
25
		"name": "edge",
26
		"text": ""
27
	}
28
 ],
29
 "vertices": [
30
  {
31
   "archetype": 0,
32
   "attributes": {},
33
   "id": 1,
34
   "text": "",
35
   "title": "V1"
36
  },
37
  {
38
   "archetype": 1,
39
   "attributes": {},
40
   "id": 2,
41
   "text": "",
42
   "title": "V2"
43
  },
44
  {
45
   "archetype": 1,
46
   "attributes": {},
47
   "id": 3,
48
   "text": "",
49
   "title": "V3"
50
  },
51
  {
52
   "archetype": 3,
53
   "attributes": {},
54
   "id": 4,
55
   "text": "",
56
   "title": "V4"
57
  },
58
  {
59
   "archetype": 2,
60
   "attributes": {},
61
   "id": 5,
62
   "text": "",
63
   "title": "V5"
64
  }
65
 ],
66
 "edges": [
67
	{
68
	   "archetype": 0,
69
	   "from": 1,
70
	   "attributes": {},
71
	   "id": 0,
72
	   "to": 2,
73
	   "text": ""
74
	},
75
	{
76
	   "archetype": 0,
77
	   "from": 3,
78
	   "attributes": {},
79
	   "id": 1,
80
	   "to": 1,
81
	   "text": ""
82
	},
83
	{
84
	   "archetype": 0,
85
	   "from": 1,
86
	   "attributes": {},
87
	   "id": 2,
88
	   "to": 4,
89
	   "text": ""
90
	},
91
	{
92
	   "archetype": 0,
93
	   "from": 4,
94
	   "attributes": {},
95
	   "id": 3,
96
	   "to": 1,
97
	   "text": ""
98
	},
99
	{
100
	   "archetype": 0,
101
	   "from": 4,
102
	   "attributes": {},
103
	   "id": 4,
104
	   "to": 5,
105
	   "text": ""
106
	}
107
 ]
108
}
test/data/aswi2017falsum.json
1
{
2
 "attributeTypes": [
3
  {
4
   "dataType": "string",
5
   "name": "EID",
6
   "text": "External ID"
7
  },
8
  {
9
   "dataType": "string",
10
   "name": "Name",
11
   "text": ""
12
  },
13
  {
14
   "dataType": "string",
15
   "name": "Description",
16
   "text": ""
17
  },
18
  {
19
   "dataType": "string",
20
   "name": "Comment",
21
   "text": ""
22
  },
23
  {
24
   "dataType": "string",
25
   "name": "Message",
26
   "text": "Commit message"
27
  },
28
  {
29
   "dataType": "string",
30
   "name": "Identities",
31
   "text": "Logins, aliases, other names"
32
  },
33
  {
34
   "dataType": "string",
35
   "name": "Emails",
36
   "text": ""
37
  },
38
  {
39
   "dataType": "enum",
40
   "name": "Roles",
41
   "text": ""
42
  },
43
  {
44
   "dataType": "enum",
45
   "name": "Author",
46
   "text": "Author's name"
47
  },
48
  {
49
   "dataType": "date",
50
   "name": "Created",
51
   "text": "Creation date"
52
  },
53
  {
54
   "dataType": "string",
55
   "name": "URL",
56
   "text": ""
57
  },
58
  {
59
   "dataType": "number",
60
   "name": "Number",
61
   "text": "Ticket number in issue tracker"
62
  },
63
  {
64
   "dataType": "enum",
65
   "name": "Assignee",
66
   "text": "Assignee's name"
67
  },
68
  {
69
   "dataType": "enum",
70
   "name": "Type",
71
   "text": ""
72
  },
73
  {
74
   "dataType": "enum",
75
   "name": "Priority",
76
   "text": ""
77
  },
78
  {
79
   "dataType": "enum",
80
   "name": "Severity",
81
   "text": ""
82
  },
83
  {
84
   "dataType": "date",
85
   "name": "Start",
86
   "text": "Start date"
87
  },
88
  {
89
   "dataType": "date",
90
   "name": "Due",
91
   "text": "Due date"
92
  },
93
  {
94
   "dataType": "enum",
95
   "name": "Iteration",
96
   "text": ""
97
  },
98
  {
99
   "dataType": "enum",
100
   "name": "Status",
101
   "text": ""
102
  },
103
  {
104
   "dataType": "enum",
105
   "name": "Resolution",
106
   "text": ""
107
  },
108
  {
109
   "dataType": "number",
110
   "name": "Estimate",
111
   "text": "Estimated time"
112
  },
113
  {
114
   "dataType": "number",
115
   "name": "Spent",
116
   "text": "Spent time"
117
  },
118
  {
119
   "dataType": "number",
120
   "name": "Progress",
121
   "text": "% done"
122
  },
123
  {
124
   "dataType": "enum",
125
   "name": "Categories",
126
   "text": ""
127
  },
128
  {
129
   "dataType": "string",
130
   "name": "Identifier",
131
   "text": ""
132
  },
133
  {
134
   "dataType": "date",
135
   "name": "Committed",
136
   "text": "Committed on date"
137
  },
138
  {
139
   "dataType": "string",
140
   "name": "Changes",
141
   "text": ""
142
  },
143
  {
144
   "dataType": "enum",
145
   "name": "Branches",
146
   "text": ""
147
  },
148
  {
149
   "dataType": "enum",
150
   "name": "Tags",
151
   "text": "VCS tags"
152
  },
153
  {
154
   "dataType": "enum",
155
   "name": "MIME",
156
   "text": "MIME type"
157
  },
158
  {
159
   "dataType": "number",
160
   "name": "Size",
161
   "text": "in bytes"
162
  },
163
  {
164
   "dataType": "enum",
165
   "name": "Relation",
166
   "text": "Relation type"
167
  },
168
  {
169
   "dataType": "enum",
170
   "name": "Role classes",
171
   "text": ""
172
  },
173
  {
174
   "dataType": "enum",
175
   "name": "Role super classes",
176
   "text": ""
177
  },
178
  {
179
   "dataType": "enum",
180
   "name": "Type class",
181
   "text": ""
182
  },
183
  {
184
   "dataType": "enum",
185
   "name": "Priority class",
186
   "text": ""
187
  },
188
  {
189
   "dataType": "enum",
190
   "name": "Priority super class",
191
   "text": ""
192
  },
193
  {
194
   "dataType": "enum",
195
   "name": "Severity class",
196
   "text": ""
197
  },
198
  {
199
   "dataType": "enum",
200
   "name": "Severity super class",
201
   "text": ""
202
  },
203
  {
204
   "dataType": "enum",
205
   "name": "Status class",
206
   "text": ""
207
  },
208
  {
209
   "dataType": "enum",
210
   "name": "Status super class",
211
   "text": ""
212
  },
213
  {
214
   "dataType": "enum",
215
   "name": "Resolution class",
216
   "text": ""
217
  },
218
  {
219
   "dataType": "enum",
220
   "name": "Resolution super class",
221
   "text": ""
222
  }
223
 ],
224
 "vertexArchetypes": [
225
  {
226
   "name": "Person",
227
   "text": ""
228
  },
229
  {
230
   "name": "Ticket",
231
   "text": ""
232
  },
233
  {
234
   "name": "File",
235
   "text": ""
236
  },
237
  {
238
   "name": "Wiki",
239
   "text": ""
240
  },
241
  {
242
   "name": "Change",
243
   "text": ""
244
  },
245
  {
246
   "name": "Commit",
247
   "text": ""
248
  },
249
  {
250
   "name": "RepoFile",
251
   "text": ""
252
  }
253
 ],
254
 "edgeArchetypes": [
255
  {
256
   "name": "Authorship",
257
   "text": ""
258
  },
259
  {
260
   "name": "Assignment",
261
   "text": ""
262
  },
263
  {
264
   "name": "CommitParticipation",
265
   "text": ""
266
  },
267
  {
268
   "name": "ItemRelation",
269
   "text": ""
270
  },
271
  {
272
   "name": "Affection",
273
   "text": ""
274
  },
275
  {
276
   "name": "Commit",
277
   "text": ""
278
  },
279
  {
280
   "name": "Modification",
281
   "text": ""
282
  }
283
 ],
284
 "vertices": [
285
  {
286
   "archetype": 0,
287
   "attributes": {
288
    "33": [
289
     "DEVELOPER",
290
     "STAKEHOLDER"
291
    ],
292
    "1": "JL",
293
    "34": [
294
     "TEAMMEMBER",
295
     "STAKEHOLDER"
296
    ],
297
    "5": [
298
     "",
299
     "Goheeca",
300
     "JL",
301
     "goheeca"
302
    ],
303
    "6": [
304
     "JL"
305
    ],
306
    "7": [
307
     "Developer",
308
     "Project admin"
309
    ]
310
   },
311
   "id": 0,
312
   "text": "",
313
   "title": "JL"
314
  },
315
  {
316
   "archetype": 0,
317
   "attributes": {
318
    "33": ["TEAMMEMBER"],
319
    "1": "TC",
320
    "34": ["TEAMMEMBER"],
321
    "5": [
322
     "",
323
     "TC"
324
    ],
325
    "7": ["member"]
326
   },
327
   "id": 1,
328
   "text": "",
329
   "title": "TC"
330
  },
331
  {
332
   "archetype": 0,
333
   "attributes": {
334
    "33": [
335
     "DEVELOPER",
336
     "STAKEHOLDER"
337
    ],
338
    "1": "VL",
339
    "34": [
340
     "TEAMMEMBER",
341
     "STAKEHOLDER"
342
    ],
343
    "5": [
344
     "",
345
     "VL",
346
    ],
347
    "6": [
348
     "VL",
349
    ],
350
    "7": [
351
     "Developer",
352
     "Project admin"
353
    ]
354
   },
355
   "id": 2,
356
   "text": "",
357
   "title": "VL"
358
  },
359
  {
360
   "archetype": 0,
361
   "attributes": {
362
    "33": [
363
     "DEVELOPER",
364
     "PROJECTMANAGER",
365
     "STAKEHOLDER"
366
    ],
367
    "1": "laptop",
368
    "34": [
369
     "TEAMMEMBER",
370
     "MANAGEMENT",
371
     "STAKEHOLDER"
372
    ],
373
    "5": [
374
     "",
375
     "LO",
376
     "laptop",
377
    ],
378
    "6": [
379
     "LO",
380
    ],
381
    "7": [
382
     "Developer",
383
     "Team leader",
384
     "Project admin"
385
    ]
386
   },
387
   "id": 3,
388
   "text": "",
389
   "title": "laptop"
390
  },
391
  {
392
   "archetype": 0,
393
   "attributes": {
394
    "33": [
395
     "DEVELOPER",
396
     "STAKEHOLDER"
397
    ],
398
    "1": "KB",
399
    "34": [
400
     "TEAMMEMBER",
401
     "STAKEHOLDER"
402
    ],
403
    "5": [
404
     "",
405
     "KB",
406
    ],
407
    "6": [
408
     "KB",
409
    ],
410
    "7": [
411
     "Developer",
412
     "Project admin"
413
    ]
414
   },
415
   "id": 4,
416
   "text": "",
417
   "title": "KB"
418
  },
419
  {
420
   "archetype": 0,
421
   "attributes": {
422
    "33": ["TEAMMEMBER"],
423
    "1": "GitHub",
424
    "34": ["TEAMMEMBER"],
425
    "5": [
426
     "",
427
     "GitHub",
428
     "noreply"
429
    ],
430
    "6": ["noreply@github.com"],
431
    "7": ["member"]
432
   },
433
   "id": 5,
434
   "text": "",
435
   "title": "GitHub"
436
  },
437
  {
438
   "archetype": 0,
439
   "attributes": {
440
    "33": ["MENTOR"],
441
    "1": "PB",
442
    "34": ["STAKEHOLDER"],
443
    "5": [
444
     "PB",
445
    ],
446
    "7": ["Mentor"]
447
   },
448
   "id": 6,
449
   "text": "",
450
   "title": "PB"
451
  },
452
  {
453
   "archetype": 0,
454
   "attributes": {
455
    "33": [
456
     "MENTOR",
457
     "DEVELOPER",
458
     "PROJECTMANAGER",
459
     "STAKEHOLDER",
460
     "STAKEHOLDER"
461
    ],
462
    "1": "PP",
463
    "34": [
464
     "STAKEHOLDER",
465
     "TEAMMEMBER",
466
     "MANAGEMENT",
467
     "STAKEHOLDER",
468
     "STAKEHOLDER"
469
    ],
470
    "5": [
471
     "PP",
472
    ],
473
    "7": [
474
     "Mentor",
475
     "Developer",
476
     "Team leader",
477
     "Customer",
478
     "Project admin"
479
    ]
480
   },
481
   "id": 7,
482
   "text": "",
483
   "title": "PP"
484
  },
485
  {
486
   "archetype": 0,
487
   "attributes": {
488
    "33": [
489
     "STAKEHOLDER",
490
     "STAKEHOLDER"
491
    ],
492
    "1": "JL",
493
    "34": [
494
     "STAKEHOLDER",
495
     "STAKEHOLDER"
496
    ],
497
    "5": [
498
     "JL",
499
    ],
500
    "6": [
501
     "JL",
502
    ],
503
    "7": [
504
     "Customer",
505
     "Project admin"
506
    ]
507
   },
508
   "id": 8,
509
   "text": "",
510
   "title": "JL"
511
  },
512
  {
513
   "archetype": 0,
514
   "attributes": {
515
    "33": ["TEAMMEMBER"],
516
    "1": "unknown",
517
    "34": ["TEAMMEMBER"],
518
    "5": [
519
     "",
520
     "unknown"
521
    ],
522
    "6": [],
523
    "7": ["member"]
524
   },
525
   "id": 9,
526
   "text": "",
527
   "title": "unknown"
528
  },
529
  {
530
   "archetype": 1,
531
   "attributes": {
532
    "22": "4.0",
533
    "23": "0",
534
    "24": [],
535
    "10": "https://students.kiv.zcu.cz:3443/issues/5893",
536
    "11": "5893",
537
    "12": ["VL"],
538
    "13": ["Enhancement"],
539
    "35": ["ENHANCEMENT"],
540
    "14": ["Normal"],
541
    "36": ["NORMAL"],
542
    "37": ["NORMAL"],
543
    "15": ["unassigned"],
544
    "38": ["NORMAL"],
545
    "16": "2017-05-05 00:00:00",
546
    "39": ["UNASSIGNED"],
547
    "17": "2017-05-11 00:00:00",
548
    "18": ["4. iterace"],
549
    "19": ["Closed"],
550
    "0": "5893",
551
    "1": "backend: flow registrace uzivatele s emailem",
552
    "2": "email viz: https://console.ng.bluemix.net/catalog/services/sendgrid",
553
    "8": ["VL"],
554
    "9": "2017-05-05 14:47:12",
555
    "40": ["DONE"],
556
    "41": ["CLOSED"],
557
    "20": ["unassigned"],
558
    "42": ["UNASSIGNED"],
559
    "43": ["UNASSIGNED"],
560
    "21": "4.0"
561
   },
562
   "id": 10,
563
   "text": "",
564
   "title": "5893"
565
  },
566
  {
567
   "archetype": 1,
568
   "attributes": {
569
    "22": "4.0",
570
    "23": "100",
571
    "24": [],
572
    "10": "https://students.kiv.zcu.cz:3443/issues/5894",
573
    "11": "5894",
574
    "12": ["unknown"],
575
    "13": ["Enhancement"],
576
    "35": ["ENHANCEMENT"],
577
    "14": ["Normal"],
578
    "36": ["NORMAL"],
579
    "37": ["NORMAL"],
580
    "15": ["unassigned"],
581
    "38": ["NORMAL"],
582
    "16": "2017-05-05 00:00:00",
583
    "39": ["UNASSIGNED"],
584
    "17": "2017-05-11 00:00:00",
585
    "18": ["4. iterace"],
586
    "19": ["Closed"],
587
    "0": "5894",
588
    "1": "frontend: pridani neregistrovaneho uzivatele k projektu",
589
    "2": "",
590
    "8": ["VL"],
591
    "9": "2017-05-05 14:47:55",
592
    "40": ["DONE"],
593
    "41": ["CLOSED"],
594
    "20": ["unassigned"],
595
    "42": ["UNASSIGNED"],
596
    "43": ["UNASSIGNED"],
597
    "21": "4.0"
598
   },
599
   "id": 11,
600
   "text": "",
601
   "title": "5894"
602
  },
603
  {
604
   "archetype": 1,
605
   "attributes": {
606
    "22": "4.0",
607
    "23": "100",
608
    "24": [],
609
    "10": "https://students.kiv.zcu.cz:3443/issues/5895",
610
    "11": "5895",
611
    "12": ["VL"],
612
    "13": ["Enhancement"],
613
    "35": ["ENHANCEMENT"],
614
    "14": ["Normal"],
615
    "36": ["NORMAL"],
616
    "37": ["NORMAL"],
617
    "15": ["unassigned"],
618
    "38": ["NORMAL"],
619
    "16": "2017-05-05 00:00:00",
620
    "39": ["UNASSIGNED"],
621
    "17": "2017-05-11 00:00:00",
622
    "18": ["4. iterace"],
623
    "19": ["Closed"],
624
    "0": "5895",
625
    "1": "bluemix email service: sendgrid",
626
    "2": "",
627
    "8": ["VL"],
628
    "9": "2017-05-05 15:10:43",
629
    "40": ["DONE"],
630
    "41": ["CLOSED"],
631
    "20": ["unassigned"],
632
    "42": ["UNASSIGNED"],
633
    "43": ["UNASSIGNED"],
634
    "21": "4.0"
635
   },
636
   "id": 12,
637
   "text": "",
638
   "title": "5895"
639
  },
640
  {
641
   "archetype": 1,
642
   "attributes": {
643
    "22": "6.0",
644
    "23": "100",
645
    "24": [],
646
    "10": "https://students.kiv.zcu.cz:3443/issues/5896",
647
    "11": "5896",
648
    "12": ["unknown"],
649
    "13": ["Enhancement"],
650
    "35": ["ENHANCEMENT"],
651
    "14": ["Normal"],
652
    "36": ["NORMAL"],
653
    "37": ["NORMAL"],
654
    "15": ["unassigned"],
655
    "38": ["NORMAL"],
656
    "16": "2017-05-05 00:00:00",
657
    "39": ["UNASSIGNED"],
658
    "17": "2017-05-11 00:00:00",
659
    "18": ["4. iterace"],
660
    "19": ["Closed"],
661
    "0": "5896",
662
    "1": "frontend: registracni formulař s predvyplnenymi daty z url (z emailu)",
663
    "2": "",
664
    "8": ["VL"],
665
    "9": "2017-05-05 15:26:55",
666
    "40": ["DONE"],
667
    "41": ["CLOSED"],
668
    "20": ["unassigned"],
669
    "42": ["UNASSIGNED"],
670
    "43": ["UNASSIGNED"],
671
    "21": "6.0"
672
   },
673
   "id": 13,
674
   "text": "",
675
   "title": "5896"
676
  },
677
  {
678
   "archetype": 1,
679
   "attributes": {
680
    "22": "2.0",
681
    "23": "100",
682
    "24": [],
683
    "10": "https://students.kiv.zcu.cz:3443/issues/5145",
684
    "11": "5145",
685
    "12": ["KB"],
686
    "13": ["Task"],
687
    "35": ["TASK"],
688
    "14": ["Normal"],
689
    "36": ["NORMAL"],
690
    "37": ["NORMAL"],
691
    "15": ["unassigned"],
692
    "38": ["NORMAL"],
693
    "16": "2017-03-20 00:00:00",
694
    "39": ["UNASSIGNED"],
... Rozdílový soubor je zkrácen, protože jeho délka přesahuje max. limit.

Také k dispozici: Unified diff