@Test
 public void testGetAs() throws Exception {
   MutableList<String> list = MutableList.of("x");
   assertEquals(Yamls.getAs(list.iterator(), List.class), list);
   assertEquals(Yamls.getAs(list.iterator(), Iterable.class), list);
   assertEquals(Yamls.getAs(list.iterator(), Iterator.class), list.iterator());
   assertEquals(Yamls.getAs(list.iterator(), String.class), "x");
 }
 @Test
 public void testReplace() {
   Assert.assertEquals(
       Yamls.getTextOfYamlAtPath("x: a\n bc", "x")
           .getFullYamlTextWithExtractReplaced("\nc: 1\nd: 2"),
       "x: \n   c: 1\n   d: 2");
 }
 @Test
 public void testGetSensorPredicateNoWhitelist() {
   Object rootElement = Iterables.getOnlyElement(Yamls.parseAll(PLANS_YAML));
   Predicate<String> predicate =
       BrooklynServiceInstanceBindingService.getSensorWhitelistPredicate(rootElement);
   assertNotNull(predicate);
   assertTrue(predicate.apply("foo.bar"));
   assertTrue(predicate.apply("bar.foo"));
 }
  @Test
  public void testExtractInList() {
    String sample =
        "- a\n"
            + "- b: 2\n"
            + "- # c\n"
            + " c1:\n"
            + "  1\n"
            + " c2:\n"
            + "  2\n"
            + "-\n"
            + " - a # for a\n"
            + " # for b\n"
            + " - b\n";

    Assert.assertEquals(Yamls.getTextOfYamlAtPath(sample, 0).getMatchedYamlText(), "a");
    Assert.assertEquals(Yamls.getTextOfYamlAtPath(sample, 1, "b").getMatchedYamlText(), "2");
    Assert.assertEquals(
        Yamls.getTextOfYamlAtPath(sample, 3, 0).getMatchedYamlText(), "a"
        // TODO comments after on same line not yet included - would be nice to add
        //            "a # for a"
        );

    // out-dent
    Assert.assertEquals(
        Yamls.getTextOfYamlAtPath(sample, 2).getMatchedYamlText(), "c1:\n 1\nc2:\n 2\n");
    // don't outdent
    Assert.assertEquals(
        Yamls.getTextOfYamlAtPath(sample, 2).withOriginalIndentation(true).getMatchedYamlText(),
        " c1:\n  1\n c2:\n  2\n");
    Assert.assertEquals(
        Yamls.getTextOfYamlAtPath(sample, 3, 0).withOriginalIndentation(true).getMatchedYamlText(),
        "   a"
        // as above, comments after not included
        //            "   a # for a"
        );

    // with preceding comments
    // TODO final item includes newline (and comments) after - this behaviour might change, it's
    // inconsistent,
    // but it means the final comments aren't lost
    Assert.assertEquals(
        Yamls.getTextOfYamlAtPath(sample, 3, 1).getMatchedYamlText(), "# for b\nb\n");

    // exclude preceding comments
    Assert.assertEquals(
        Yamls.getTextOfYamlAtPath(sample, 3, 1)
            .withPrecedingCommentsIncluded(false)
            .getMatchedYamlText(),
        "b\n");
  }
 /**
  * Returns a wrapped map, if the object is YAML which parses as a map; otherwise returns absent
  * capable of throwing an error with more details
  */
 @SuppressWarnings("unchecked")
 public static Maybe<Map<?, ?>> getAsYamlMap(Object planData) {
   if (!(planData instanceof String)) return Maybe.absent("not a string");
   Iterable<Object> result;
   try {
     result = Yamls.parseAll((String) planData);
   } catch (Exception e) {
     Exceptions.propagateIfFatal(e);
     return Maybe.absent(e);
   }
   Iterator<Object> ri = result.iterator();
   if (!ri.hasNext()) return Maybe.absent("YAML has no elements in it");
   Object r1 = ri.next();
   if (ri.hasNext()) return Maybe.absent("YAML has multiple elements in it");
   if (r1 instanceof Map) return (Maybe<Map<?, ?>>) (Maybe<?>) Maybe.of(r1);
   return Maybe.absent("YAML does not contain a map");
 }
  @Test
  public void testExtractNoOOBE() {
    // this might log a warning, as item not found, but won't throw
    YamlExtract r1 =
        Yamls.getTextOfYamlAtPath(
            "items:\n- id: sample2\n  itemType: location\n  item:\n    type: jclouds:aws-ec2\n    brooklyn.config:\n      key2: value2\n\n",
            "item");

    // won't throw
    r1.getMatchedYamlTextOrWarn();
    // will throw
    try {
      r1.getMatchedYamlText();
      Assert.fail();
    } catch (UserFacingException e) {
      // expected, it should give a vaguely explanatory exception and no trace
    }
  }
  @Test
  public void testGetAt() throws Exception {
    // leaf of map
    assertEquals(Yamls.getAt("k1: v", ImmutableList.of("k1")), "v");
    assertEquals(Yamls.getAt("k1: {k2: v}", ImmutableList.of("k1", "k2")), "v");

    // get list
    assertEquals(
        Yamls.getAt("k1: [v1, v2]", ImmutableList.<String>of("k1")), ImmutableList.of("v1", "v2"));

    // get map
    assertEquals(Yamls.getAt("k1: v", ImmutableList.<String>of()), ImmutableMap.of("k1", "v"));
    assertEquals(Yamls.getAt("k1: {k2: v}", ImmutableList.of("k1")), ImmutableMap.of("k2", "v"));

    // get array index
    assertEquals(Yamls.getAt("k1: [v1, v2]", ImmutableList.<String>of("k1", "[0]")), "v1");
    assertEquals(Yamls.getAt("k1: [v1, v2]", ImmutableList.<String>of("k1", "[1]")), "v2");
  }
  @Test
  public void testExtractMap() {
    String sample = "#before\nk1:\n- v1\nk2:\n  # comment\n  k21: v21\nk3: v3\n#after\n";

    Assert.assertEquals(
        Yamls.getTextOfYamlAtPath(sample, "k1").withKeyIncluded(true).getMatchedYamlText(),
        sample.substring(0, sample.indexOf("k2")));
    Assert.assertEquals(
        Yamls.getTextOfYamlAtPath(sample, "k3").withKeyIncluded(true).getMatchedYamlText(),
        sample.substring(sample.indexOf("k3")));

    // comments and no key, outdented - the default
    Assert.assertEquals(
        Yamls.getTextOfYamlAtPath(sample, "k2", "k21").getMatchedYamlText(), "# comment\nv21");
    Assert.assertEquals(
        Yamls.getTextOfYamlAtPath(sample, "k2", "k21").getMatchedYamlText(), "# comment\nv21");
    // comments and key
    Assert.assertEquals(
        Yamls.getTextOfYamlAtPath(sample, "k2", "k21").withKeyIncluded(true).getMatchedYamlText(),
        "# comment\nk21: v21");
    // no comments
    Assert.assertEquals(
        Yamls.getTextOfYamlAtPath(sample, "k2", "k21")
            .withKeyIncluded(true)
            .withPrecedingCommentsIncluded(false)
            .getMatchedYamlText(),
        "k21: v21");
    // no comments and no key
    Assert.assertEquals(
        Yamls.getTextOfYamlAtPath(sample, "k2", "k21")
            .withPrecedingCommentsIncluded(false)
            .getMatchedYamlText(),
        "v21");

    // comments and no key, not outdented
    Assert.assertEquals(
        Yamls.getTextOfYamlAtPath(sample, "k2", "k21")
            .withOriginalIndentation(true)
            .getMatchedYamlText(),
        "  # comment\n  v21");
    // comments and key
    Assert.assertEquals(
        Yamls.getTextOfYamlAtPath(sample, "k2", "k21")
            .withKeyIncluded(true)
            .withOriginalIndentation(true)
            .getMatchedYamlText(),
        "  # comment\n  k21: v21");
    // no comments
    Assert.assertEquals(
        Yamls.getTextOfYamlAtPath(sample, "k2", "k21")
            .withKeyIncluded(true)
            .withPrecedingCommentsIncluded(false)
            .withOriginalIndentation(true)
            .getMatchedYamlText(),
        "  k21: v21");
    // no comments and no key
    Assert.assertEquals(
        Yamls.getTextOfYamlAtPath(sample, "k2", "k21")
            .withPrecedingCommentsIncluded(false)
            .withOriginalIndentation(true)
            .getMatchedYamlText(),
        "  v21");
  }
 @Test
 public void testExtractMapWithOddWhitespace() {
   Assert.assertEquals(Yamls.getTextOfYamlAtPath("x: a\n bc", "x").getMatchedYamlText(), "a\n bc");
 }
 @Test
 public void testExtractMapIgnoringPreviousComments() {
   String sample = "a: 1 # one\n" + "b: 2 # two";
   Assert.assertEquals(Yamls.getTextOfYamlAtPath(sample, "b").getMatchedYamlText(), "2 # two");
 }