// Copyright © 2012-2020 VLINGO LABS. All rights reserved.
//
// This Source Code Form is subject to the terms of the
// Mozilla Public License, v. 2.0. If a copy of the MPL
// was not distributed with this file, You can obtain
// one at https://mozilla.org/MPL/2.0/.

package io.vlingo.lattice.query;

import org.junit.Assert;
import org.junit.Test;

import io.vlingo.actors.CompletionTranslator;
import io.vlingo.symbio.store.QueryExpression;

@SuppressWarnings({ "rawtypes", "unchecked" })
public class ObjectQueryFailedExceptionTest {

  @Test
  public void testThatFailedHasAttempt() {
    final QueryAttempt<?,?,?> queryAttempt = new QueryAttempt(QueryAttempt.Cardinality.All, Object.class, QueryExpression.using(Object.class, ""), CompletionTranslator.translatorOrNull((o) -> null, null));
    final ObjectQueryFailedException e = new ObjectQueryFailedException(queryAttempt);

    Assert.assertNotNull(e);
    Assert.assertNotNull(e.queryAttempt);
    Assert.assertEquals(QueryAttempt.Cardinality.All, e.queryAttempt.cardinality);
    Assert.assertNotNull(e.queryAttempt.stateObjectType);
    Assert.assertNotNull(e.queryAttempt.query);
    Assert.assertNotNull(e.queryAttempt.completionTranslator);
    Assert.assertNull(e.getMessage());
    Assert.assertNull(e.getCause());
  }

  @Test
  public void testThatFailedHasExceptionInfo() {
    final Exception cause = new Exception("TestInner", new Exception());
    final QueryAttempt<?,?,?> queryAttempt = new QueryAttempt(QueryAttempt.Cardinality.All, Object.class, QueryExpression.using(Object.class, ""), CompletionTranslator.translatorOrNull((o) -> null, null));
    final ObjectQueryFailedException e = new ObjectQueryFailedException(queryAttempt, "TestOuter", cause);

    Assert.assertNotNull(e);
    Assert.assertNotNull(e.queryAttempt);
    Assert.assertEquals("TestOuter", e.getMessage());
    Assert.assertNotNull(e.getCause());
    Assert.assertEquals("TestInner", e.getCause().getMessage());
    Assert.assertNotNull(e.getMessage());
    Assert.assertNotNull(e.getCause().getCause());
    Assert.assertNull(e.getCause().getCause().getMessage());
  }
}