10ff15e6dff5ff4dc25656a75b4e4dad61633562cCédric Beustpackage org.testng.internal;
20ff15e6dff5ff4dc25656a75b4e4dad61633562cCédric Beust
30ff15e6dff5ff4dc25656a75b4e4dad61633562cCédric Beustimport org.testng.xml.XmlClass;
4e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beustimport org.testng.xml.XmlInclude;
58ee0cb96ed3f74d6407f4340785c3cf96bc1d407Cédric Beustimport org.testng.xml.XmlPackage;
60ff15e6dff5ff4dc25656a75b4e4dad61633562cCédric Beustimport org.testng.xml.XmlSuite;
70ff15e6dff5ff4dc25656a75b4e4dad61633562cCédric Beustimport org.testng.xml.XmlTest;
8f3ba8fb2363626ec1bc5c9641b2a507fe923d5d1Cédric Beustimport org.yaml.snakeyaml.TypeDescription;
9f3ba8fb2363626ec1bc5c9641b2a507fe923d5d1Cédric Beustimport org.yaml.snakeyaml.constructor.Constructor;
109ca0dbb4b3f9745b0aa4cad88fc17504ca1f3e83Julien Herrimport org.yaml.snakeyaml.nodes.Node;
119ca0dbb4b3f9745b0aa4cad88fc17504ca1f3e83Julien Herrimport org.yaml.snakeyaml.nodes.NodeId;
129ca0dbb4b3f9745b0aa4cad88fc17504ca1f3e83Julien Herrimport org.yaml.snakeyaml.nodes.ScalarNode;
13c144ac69e249441ccc436bfc6337baf50f83a7c4Cédric Beust
140ff15e6dff5ff4dc25656a75b4e4dad61633562cCédric Beustimport java.io.File;
150ff15e6dff5ff4dc25656a75b4e4dad61633562cCédric Beustimport java.io.FileInputStream;
160ff15e6dff5ff4dc25656a75b4e4dad61633562cCédric Beustimport java.io.FileNotFoundException;
17f2d1ac2d4c85d269807c3aad528d6746513a9bfaCédric Beustimport java.io.InputStream;
180ff15e6dff5ff4dc25656a75b4e4dad61633562cCédric Beustimport java.util.List;
190ff15e6dff5ff4dc25656a75b4e4dad61633562cCédric Beustimport java.util.Map;
200ff15e6dff5ff4dc25656a75b4e4dad61633562cCédric Beust
218ee0cb96ed3f74d6407f4340785c3cf96bc1d407Cédric Beust/**
228ee0cb96ed3f74d6407f4340785c3cf96bc1d407Cédric Beust * YAML support for TestNG.
233b56bf5c02a8b63dac1382c57abbbb9f0b02cf98Ryan Schmitt *
241bc72f147bc68596499591920997af8a9bfdde1dCédric Beust * @author Cedric Beust <cedric@beust.com>
258ee0cb96ed3f74d6407f4340785c3cf96bc1d407Cédric Beust */
260ff15e6dff5ff4dc25656a75b4e4dad61633562cCédric Beustpublic class Yaml {
270ff15e6dff5ff4dc25656a75b4e4dad61633562cCédric Beust
28f2d1ac2d4c85d269807c3aad528d6746513a9bfaCédric Beust  public static XmlSuite parse(String filePath, InputStream is)
29f2d1ac2d4c85d269807c3aad528d6746513a9bfaCédric Beust      throws FileNotFoundException {
309ca0dbb4b3f9745b0aa4cad88fc17504ca1f3e83Julien Herr    Constructor constructor = new TestNGConstructor(XmlSuite.class);
31e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust    {
32e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust      TypeDescription suiteDescription = new TypeDescription(XmlSuite.class);
33e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust      suiteDescription.putListPropertyType("packages", XmlPackage.class);
34e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust      suiteDescription.putListPropertyType("listeners", String.class);
35e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust      suiteDescription.putListPropertyType("tests", XmlTest.class);
36e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust      suiteDescription.putListPropertyType("method-selectors", XmlMethodSelector.class);
37e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust      constructor.addTypeDescription(suiteDescription);
38e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust    }
39e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust
40e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust    {
41e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust      TypeDescription testDescription = new TypeDescription(XmlTest.class);
42e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust      testDescription.putListPropertyType("classes", XmlClass.class);
43e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust      testDescription.putMapPropertyType("metaGroups", String.class, List.class);
44c055119f5c9b001961eaa89cb8eaef169100a22cCédric Beust      testDescription.putListPropertyType("method-selectors", XmlMethodSelector.class);
45e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust      constructor.addTypeDescription(testDescription);
46e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust    }
47e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust
483b56bf5c02a8b63dac1382c57abbbb9f0b02cf98Ryan Schmitt    org.yaml.snakeyaml.Yaml y = new org.yaml.snakeyaml.Yaml(constructor);
49f2d1ac2d4c85d269807c3aad528d6746513a9bfaCédric Beust    if (is == null) is = new FileInputStream(new File(filePath));
50f2d1ac2d4c85d269807c3aad528d6746513a9bfaCédric Beust    XmlSuite result = (XmlSuite) y.load(is);
513aef4f8beffd5ca432cc9fbb0607206cd1ab420cCédric Beust
523aef4f8beffd5ca432cc9fbb0607206cd1ab420cCédric Beust    result.setFileName(filePath);
53fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust    // DEBUG
54fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust//    System.out.println("[Yaml] " + result.toXml());
55f3ba8fb2363626ec1bc5c9641b2a507fe923d5d1Cédric Beust
56c144ac69e249441ccc436bfc6337baf50f83a7c4Cédric Beust    // Adjust XmlTest parents and indices
57f3ba8fb2363626ec1bc5c9641b2a507fe923d5d1Cédric Beust    for (XmlTest t : result.getTests()) {
58f3ba8fb2363626ec1bc5c9641b2a507fe923d5d1Cédric Beust      t.setSuite(result);
59c144ac69e249441ccc436bfc6337baf50f83a7c4Cédric Beust      int index = 0;
60c144ac69e249441ccc436bfc6337baf50f83a7c4Cédric Beust      for (XmlClass c : t.getClasses()) {
61c144ac69e249441ccc436bfc6337baf50f83a7c4Cédric Beust        c.setIndex(index++);
62c144ac69e249441ccc436bfc6337baf50f83a7c4Cédric Beust      }
63f3ba8fb2363626ec1bc5c9641b2a507fe923d5d1Cédric Beust    }
648f6faaf3679423dd0bec9f412f38e520c9ee2519Cédric Beust
65f2d1ac2d4c85d269807c3aad528d6746513a9bfaCédric Beust    return result;
660ff15e6dff5ff4dc25656a75b4e4dad61633562cCédric Beust  }
670ff15e6dff5ff4dc25656a75b4e4dad61633562cCédric Beust
683dd683995947d9fbafa643f4918fa5b1b2644336Cédric Beust  private static void maybeAdd(StringBuilder sb, String key, Object value, Object def) {
693dd683995947d9fbafa643f4918fa5b1b2644336Cédric Beust    maybeAdd(sb, "", key, value, def);
70e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust  }
71e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust
723dd683995947d9fbafa643f4918fa5b1b2644336Cédric Beust  private static void maybeAdd(StringBuilder sb, String sp, String key, Object value, Object def) {
733dd683995947d9fbafa643f4918fa5b1b2644336Cédric Beust    if (value != null && ! value.equals(def)) {
743dd683995947d9fbafa643f4918fa5b1b2644336Cédric Beust      sb.append(sp).append(key).append(": ").append(value.toString()).append("\n");
753dd683995947d9fbafa643f4918fa5b1b2644336Cédric Beust    }
76e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust  }
77e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust
78a7de7afda803bc2f5f73d21844ce665755f36df2Cédric Beust  /**
79a7de7afda803bc2f5f73d21844ce665755f36df2Cédric Beust   * The main entry point to convert an XmlSuite into YAML. This method is allowed to be used
80a7de7afda803bc2f5f73d21844ce665755f36df2Cédric Beust   * by external tools (e.g. Eclipse).
81a7de7afda803bc2f5f73d21844ce665755f36df2Cédric Beust   */
82e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust  public static StringBuilder toYaml(XmlSuite suite) {
83e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust    StringBuilder result = new StringBuilder();
84e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust
853dd683995947d9fbafa643f4918fa5b1b2644336Cédric Beust    maybeAdd(result, "name", suite.getName(), null);
863dd683995947d9fbafa643f4918fa5b1b2644336Cédric Beust    maybeAdd(result, "junit", suite.isJUnit(), XmlSuite.DEFAULT_JUNIT);
873dd683995947d9fbafa643f4918fa5b1b2644336Cédric Beust    maybeAdd(result, "verbose", suite.getVerbose(), XmlSuite.DEFAULT_VERBOSE);
883dd683995947d9fbafa643f4918fa5b1b2644336Cédric Beust    maybeAdd(result, "threadCount", suite.getThreadCount(), XmlSuite.DEFAULT_THREAD_COUNT);
89e595879ccfc9c86cf48c8401a54e9e8c9c8665e5Cédric Beust    maybeAdd(result, "dataProviderThreadCount", suite.getDataProviderThreadCount(),
903aef4f8beffd5ca432cc9fbb0607206cd1ab420cCédric Beust        XmlSuite.DEFAULT_DATA_PROVIDER_THREAD_COUNT);
913dd683995947d9fbafa643f4918fa5b1b2644336Cédric Beust    maybeAdd(result, "timeOut", suite.getTimeOut(), null);
9224ac4199eeba20bc2d1eb84b8e4d11ab2817ef4dJulien Herr    maybeAdd(result, "parallel", suite.getParallel(), XmlSuite.DEFAULT_PARALLEL);
933dd683995947d9fbafa643f4918fa5b1b2644336Cédric Beust    maybeAdd(result, "skipFailedInvocationCounts", suite.skipFailedInvocationCounts(),
943dd683995947d9fbafa643f4918fa5b1b2644336Cédric Beust        XmlSuite.DEFAULT_SKIP_FAILED_INVOCATION_COUNTS);
95e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust
96fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust    toYaml(result, "parameters", "", suite.getParameters());
973aef4f8beffd5ca432cc9fbb0607206cd1ab420cCédric Beust    toYaml(result, suite.getPackages());
983aef4f8beffd5ca432cc9fbb0607206cd1ab420cCédric Beust
993aef4f8beffd5ca432cc9fbb0607206cd1ab420cCédric Beust    if (suite.getListeners().size() > 0) {
1003aef4f8beffd5ca432cc9fbb0607206cd1ab420cCédric Beust      result.append("listeners:\n");
1013aef4f8beffd5ca432cc9fbb0607206cd1ab420cCédric Beust      toYaml(result, "  ", suite.getListeners());
1021ae7a7e42bee4747f0c5a6a7094ae17adedb6d56Cédric Beust    }
1033aef4f8beffd5ca432cc9fbb0607206cd1ab420cCédric Beust
104cafec37c1c5651465143b6a1911bdad73cd8d6bdCédric Beust    if (suite.getPackages().size() > 0) {
105cafec37c1c5651465143b6a1911bdad73cd8d6bdCédric Beust      result.append("packages:\n");
106cafec37c1c5651465143b6a1911bdad73cd8d6bdCédric Beust      toYaml(result, suite.getPackages());
107cafec37c1c5651465143b6a1911bdad73cd8d6bdCédric Beust    }
108e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust    if (suite.getTests().size() > 0) {
1098a7ed9a159b6a7825e914c6a2da4f97011d97302Cédric Beust      result.append("tests:\n");
110e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust      for (XmlTest t : suite.getTests()) {
1118a7ed9a159b6a7825e914c6a2da4f97011d97302Cédric Beust        toYaml(result, "  ", t);
112e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust      }
113e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust    }
114e595879ccfc9c86cf48c8401a54e9e8c9c8665e5Cédric Beust
115e595879ccfc9c86cf48c8401a54e9e8c9c8665e5Cédric Beust    if (suite.getChildSuites().size() > 0) {
116e595879ccfc9c86cf48c8401a54e9e8c9c8665e5Cédric Beust      result.append("suite-files:\n");
117e595879ccfc9c86cf48c8401a54e9e8c9c8665e5Cédric Beust      toYaml(result, "  ", suite.getSuiteFiles());
118e595879ccfc9c86cf48c8401a54e9e8c9c8665e5Cédric Beust    }
119e595879ccfc9c86cf48c8401a54e9e8c9c8665e5Cédric Beust
120e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust    return result;
121e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust  }
122e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust
123e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust  private static void toYaml(StringBuilder result, String sp, XmlTest t) {
124e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust    String sp2 = sp + "  ";
1251ae7a7e42bee4747f0c5a6a7094ae17adedb6d56Cédric Beust    result.append(sp).append("- name: ").append(t.getName()).append("\n");
1263dd683995947d9fbafa643f4918fa5b1b2644336Cédric Beust
1274b42c0ba9c41a4681163c5fce1b25eff4a3545d4Cédric Beust    maybeAdd(result, sp2, "junit", t.isJUnit(), XmlSuite.DEFAULT_JUNIT);
1284b42c0ba9c41a4681163c5fce1b25eff4a3545d4Cédric Beust    maybeAdd(result, sp2, "verbose", t.getVerbose(), XmlSuite.DEFAULT_VERBOSE);
1294b42c0ba9c41a4681163c5fce1b25eff4a3545d4Cédric Beust    maybeAdd(result, sp2, "timeOut", t.getTimeOut(), null);
13024ac4199eeba20bc2d1eb84b8e4d11ab2817ef4dJulien Herr    maybeAdd(result, sp2, "parallel", t.getParallel(), XmlSuite.DEFAULT_PARALLEL);
1314b42c0ba9c41a4681163c5fce1b25eff4a3545d4Cédric Beust    maybeAdd(result, sp2, "skipFailedInvocationCounts", t.skipFailedInvocationCounts(),
1323dd683995947d9fbafa643f4918fa5b1b2644336Cédric Beust        XmlSuite.DEFAULT_SKIP_FAILED_INVOCATION_COUNTS);
1333dd683995947d9fbafa643f4918fa5b1b2644336Cédric Beust
13424215389671eeb04764ee673748987ef2c0fb367Cédric Beust    maybeAdd(result, "preserveOrder", sp2, t.getPreserveOrder(), XmlSuite.DEFAULT_PRESERVE_ORDER);
135e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust
136fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust    toYaml(result, "parameters", sp2, t.getTestParameters());
137fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust
138fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust    if (t.getIncludedGroups().size() > 0) {
139fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust      result.append(sp2).append("includedGroups: [ ")
140fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust          .append(Utils.join(t.getIncludedGroups(), ","))
141fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust          .append(" ]\n");
142fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust    }
143fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust
144fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust    if (t.getExcludedGroups().size() > 0) {
145fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust      result.append(sp2).append("excludedGroups: [ ")
146fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust          .append(Utils.join(t.getExcludedGroups(), ","))
147fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust          .append(" ]\n");
148fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust    }
149fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust
1508a7ed9a159b6a7825e914c6a2da4f97011d97302Cédric Beust    Map<String, List<String>> mg = t.getMetaGroups();
1518a7ed9a159b6a7825e914c6a2da4f97011d97302Cédric Beust    if (mg.size() > 0) {
1528a7ed9a159b6a7825e914c6a2da4f97011d97302Cédric Beust      result.append(sp2).append("metaGroups: { ");
1538a7ed9a159b6a7825e914c6a2da4f97011d97302Cédric Beust      boolean first = true;
1546e714088ed5ccb46e3f204b5048c7527729e38cdTesto Nakada      for (Map.Entry<String, List<String>> entry : mg.entrySet()) {
1558a7ed9a159b6a7825e914c6a2da4f97011d97302Cédric Beust        if (! first) result.append(", ");
1566e714088ed5ccb46e3f204b5048c7527729e38cdTesto Nakada        result.append(entry.getKey()).append(": [ ")
1576e714088ed5ccb46e3f204b5048c7527729e38cdTesto Nakada        .append(Utils.join(entry.getValue(), ",")).append(" ] ");
1588a7ed9a159b6a7825e914c6a2da4f97011d97302Cédric Beust        first = false;
159e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust      }
1608a7ed9a159b6a7825e914c6a2da4f97011d97302Cédric Beust      result.append(" }\n");
161e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust    }
162e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust
163e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust    if (t.getXmlPackages().size() > 0) {
164e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust      result.append(sp2).append("xmlPackages:\n");
165e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust      for (XmlPackage xp : t.getXmlPackages())  {
166e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust        toYaml(result, sp2 + "  - ", xp);
167e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust      }
168e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust    }
1693b56bf5c02a8b63dac1382c57abbbb9f0b02cf98Ryan Schmitt
170e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust    if (t.getXmlClasses().size() > 0) {
171e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust      result.append(sp2).append("classes:\n");
172e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust      for (XmlClass xc : t.getXmlClasses())  {
173e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust        toYaml(result, sp2 + "  ", xc);
174e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust      }
175e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust    }
176e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust
177e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust
1783dd683995947d9fbafa643f4918fa5b1b2644336Cédric Beust    result.append("\n");
179e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust  }
180e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust
181e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust  private static void toYaml(StringBuilder result, String sp2, XmlClass xc) {
182e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust    List<XmlInclude> im = xc.getIncludedMethods();
183e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust    List<String> em = xc.getExcludedMethods();
184e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust    String name = im.size() > 0 || em.size() > 0 ? "name: " : "";
185e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust
186e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust    result.append(sp2).append("- " + name).append(xc.getName()).append("\n");
187e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust    if (im.size() > 0) {
188e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust      result.append(sp2 + "  includedMethods:\n");
189e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust      for (XmlInclude xi : im) {
190e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust        toYaml(result, sp2 + "    ", xi);
191e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust      }
192e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust    }
193e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust
194e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust    if (em.size() > 0) {
1951ae7a7e42bee4747f0c5a6a7094ae17adedb6d56Cédric Beust      result.append(sp2 + "  excludedMethods:\n");
196e8527edfb6b4b54395c9cdd0b8bd56a50cedfcb9Cédric Beust      toYaml(result, sp2 + "    ", em);
197e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust    }
198e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust  }
199e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust
200e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust  private static void toYaml(StringBuilder result, String sp2, XmlInclude xi) {
2011ae7a7e42bee4747f0c5a6a7094ae17adedb6d56Cédric Beust    result.append(sp2 + "- " + xi.getName()).append("\n");
202e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust  }
203e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust
2041ae7a7e42bee4747f0c5a6a7094ae17adedb6d56Cédric Beust  private static void toYaml(StringBuilder result, String sp, List<String> strings) {
2051ae7a7e42bee4747f0c5a6a7094ae17adedb6d56Cédric Beust    for (String l : strings) {
2061ae7a7e42bee4747f0c5a6a7094ae17adedb6d56Cédric Beust      result.append(sp).append("- ").append(l).append("\n");
207e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust    }
208e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust  }
209e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust
210e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust  private static final String SP = "  ";
211e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust
212e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust  private static void toYaml(StringBuilder sb, List<XmlPackage> packages) {
2133aef4f8beffd5ca432cc9fbb0607206cd1ab420cCédric Beust    if (packages.size() > 0) {
2143aef4f8beffd5ca432cc9fbb0607206cd1ab420cCédric Beust      sb.append("packages:\n");
2153aef4f8beffd5ca432cc9fbb0607206cd1ab420cCédric Beust      for (XmlPackage p : packages) {
2163aef4f8beffd5ca432cc9fbb0607206cd1ab420cCédric Beust        toYaml(sb, "  ", p);
2173aef4f8beffd5ca432cc9fbb0607206cd1ab420cCédric Beust      }
218e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust    }
2196c6e3e49e66626ffb93397cd9d7dfb8029f9e6acCédric Beust    for (XmlPackage p : packages) {
2206c6e3e49e66626ffb93397cd9d7dfb8029f9e6acCédric Beust      toYaml(sb, "  ", p);
2216c6e3e49e66626ffb93397cd9d7dfb8029f9e6acCédric Beust    }
222e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust  }
223e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust
224e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust  private static void toYaml(StringBuilder sb, String sp, XmlPackage p) {
2251ae7a7e42bee4747f0c5a6a7094ae17adedb6d56Cédric Beust    sb.append(sp).append("name: ").append(p.getName()).append("\n");
226e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust
227e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust    generateIncludeExclude(sb, sp, "includes", p.getInclude());
228e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust    generateIncludeExclude(sb, sp, "excludes", p.getExclude());
229e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust  }
230e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust
231e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust  private static void generateIncludeExclude(StringBuilder sb, String sp,
232e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust      String key, List<String> includes) {
233e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust    if (includes.size() > 0) {
234e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust      sb.append(sp).append("  ").append(key).append("\n");
235e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust      for (String inc : includes) {
236e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust        sb.append(sp).append("    ").append(inc);
237e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust      }
238e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust    }
239e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust  }
240e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust
241fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust  private static void mapToYaml(Map<String, String> map, StringBuilder out) {
242fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust    if (map.size() > 0) {
243fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust      out.append("{ ");
244fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust      boolean first = true;
245fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust      for (Map.Entry<String, String> e : map.entrySet()) {
246fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust        if (! first) out.append(", ");
247fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust        first = false;
248fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust        out.append(e.getKey() + ": " + e.getValue());
249fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust      }
250fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust      out.append(" }\n");
251fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust    }
252fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust  }
253fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust
254fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust  private static void toYaml(StringBuilder sb, String key, String sp,
255fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust      Map<String, String> parameters) {
256fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust    if (parameters.size() > 0) {
257fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust      sb.append(sp).append(key).append(": ");
258fb5ee21c2262a7b7e9d93c0df6cba841222b6d25Cédric Beust      mapToYaml(parameters, sb);
259e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust    }
260e5bb0c6a57ea6a74c53f3e7ecd428c1523d4e5c9Cédric Beust  }
2611ae7a7e42bee4747f0c5a6a7094ae17adedb6d56Cédric Beust
2629ca0dbb4b3f9745b0aa4cad88fc17504ca1f3e83Julien Herr  private static class TestNGConstructor extends Constructor {
2639ca0dbb4b3f9745b0aa4cad88fc17504ca1f3e83Julien Herr    public TestNGConstructor(Class<? extends Object> theRoot) {
2649ca0dbb4b3f9745b0aa4cad88fc17504ca1f3e83Julien Herr      super(theRoot);
2659ca0dbb4b3f9745b0aa4cad88fc17504ca1f3e83Julien Herr      yamlClassConstructors.put(NodeId.scalar, new ConstructParallelMode());
2669ca0dbb4b3f9745b0aa4cad88fc17504ca1f3e83Julien Herr    }
2679ca0dbb4b3f9745b0aa4cad88fc17504ca1f3e83Julien Herr
2689ca0dbb4b3f9745b0aa4cad88fc17504ca1f3e83Julien Herr    private class ConstructParallelMode extends ConstructScalar {
2699ca0dbb4b3f9745b0aa4cad88fc17504ca1f3e83Julien Herr      public Object construct(Node node) {
2709ca0dbb4b3f9745b0aa4cad88fc17504ca1f3e83Julien Herr        if (node.getType().equals(XmlSuite.ParallelMode.class)) {
2719ca0dbb4b3f9745b0aa4cad88fc17504ca1f3e83Julien Herr          String parallel = (String) constructScalar((ScalarNode) node);
27224ac4199eeba20bc2d1eb84b8e4d11ab2817ef4dJulien Herr          return XmlSuite.ParallelMode.getValidParallel(parallel);
2739ca0dbb4b3f9745b0aa4cad88fc17504ca1f3e83Julien Herr        }
2749ca0dbb4b3f9745b0aa4cad88fc17504ca1f3e83Julien Herr        return super.construct(node);
2759ca0dbb4b3f9745b0aa4cad88fc17504ca1f3e83Julien Herr      }
2769ca0dbb4b3f9745b0aa4cad88fc17504ca1f3e83Julien Herr    }
2771ae7a7e42bee4747f0c5a6a7094ae17adedb6d56Cédric Beust  }
2780ff15e6dff5ff4dc25656a75b4e4dad61633562cCédric Beust}
279