Best Assertj code snippet using org.assertj.core.api.AbstractLocalTimeAssert.areEqualIgnoringNanos
Source:AbstractLocalTimeAssert.java
...348 */349 public SELF isEqualToIgnoringNanos(LocalTime other) {350 Objects.instance().assertNotNull(info, actual);351 assertLocalTimeParameterIsNotNull(other);352 if (!areEqualIgnoringNanos(actual, other)) {353 throw Failures.instance().failure(info, shouldBeEqualIgnoringNanos(actual, other));354 }355 return myself;356 }357 /**358 * Verifies that actual and given {@link LocalTime} have same hour and minute fields (second and nanosecond fields are359 * ignored in comparison).360 * <p>361 * Assertion can fail with LocalTimes in same chronological second time window, e.g :362 * <p>363 * 23:<b>01:00</b>.000 and 23:<b>00:59</b>.000.364 * <p>365 * Assertion fails as minute fields differ even if time difference is only 1s.366 * <p>367 * Code example :368 * <pre><code class='java'> // successful assertions369 * LocalTime localTime1 = LocalTime.of(23, 50, 0, 0);370 * LocalTime localTime2 = LocalTime.of(23, 50, 10, 456);371 * assertThat(localTime1).isEqualToIgnoringSeconds(localTime2);372 *373 * // failing assertions (even if time difference is only 1ms)374 * LocalTime localTimeA = LocalTime.of(23, 50, 00, 000);375 * LocalTime localTimeB = LocalTime.of(23, 49, 59, 999);376 * assertThat(localTimeA).isEqualToIgnoringSeconds(localTimeB);</code></pre>377 *378 * @param other the given {@link LocalTime}.379 * @return this assertion object.380 * @throws AssertionError if the actual {@code LocalTime} is {@code null}.381 * @throws IllegalArgumentException if other {@code LocalTime} is {@code null}.382 * @throws AssertionError if the actual {@code LocalTime} is are not equal with second and nanosecond fields383 * ignored.384 */385 public SELF isEqualToIgnoringSeconds(LocalTime other) {386 Objects.instance().assertNotNull(info, actual);387 assertLocalTimeParameterIsNotNull(other);388 if (!areEqualIgnoringSeconds(actual, other)) {389 throw Failures.instance().failure(info, shouldBeEqualIgnoringSeconds(actual, other));390 }391 return myself;392 }393 /**394 * Verifies that actual and given {@code LocalTime} have same hour fields (minute, second and nanosecond fields are395 * ignored in comparison).396 * <p>397 * Assertion can fail with localTimes in same chronological second time window, e.g :398 * <p>399 * <b>01:00</b>:00.000 and <b>00:59:59</b>.000.400 * <p>401 * Time difference is only 1s but hour fields differ.402 * <p>403 * Code example :404 * <pre><code class='java'> // successful assertions405 * LocalTime localTime1 = LocalTime.of(23, 50, 0, 0);406 * LocalTime localTime2 = LocalTime.of(23, 00, 2, 7);407 * assertThat(localTime1).hasSameHourAs(localTime2);408 *409 * // failing assertions (even if time difference is only 1ms)410 * LocalTime localTimeA = LocalTime.of(01, 00, 00, 000);411 * LocalTime localTimeB = LocalTime.of(00, 59, 59, 999);412 * assertThat(localTimeA).hasSameHourAs(localTimeB);</code></pre>413 *414 * @param other the given {@link LocalTime}.415 * @return this assertion object.416 * @throws AssertionError if the actual {@code LocalTime} is {@code null}.417 * @throws IllegalArgumentException if other {@code LocalTime} is {@code null}.418 * @throws AssertionError if the actual {@code LocalTime} is are not equal ignoring minute, second and nanosecond419 * fields.420 */421 public SELF hasSameHourAs(LocalTime other) {422 Objects.instance().assertNotNull(info, actual);423 assertLocalTimeParameterIsNotNull(other);424 if (!haveSameHourField(actual, other)) {425 throw Failures.instance().failure(info, shouldHaveSameHourAs(actual, other));426 }427 return myself;428 }429 /**430 * Verifies that the actual {@link LocalTime} is in the [start, end] period (start and end included).431 * <p>432 * Example:433 * <pre><code class='java'> LocalTime localTime = LocalTime.now();434 * 435 * // assertions succeed:436 * assertThat(localTime).isBetween(localTime.minusSeconds(1), localTime.plusSeconds(1))437 * .isBetween(localTime, localTime.plusSeconds(1))438 * .isBetween(localTime.minusSeconds(1), localTime)439 * .isBetween(localTime, localTime);440 * 441 * // assertions fail:442 * assertThat(localTime).isBetween(localTime.minusSeconds(10), localTime.minusSeconds(1));443 * assertThat(localTime).isBetween(localTime.plusSeconds(1), localTime.plusSeconds(10));</code></pre>444 * 445 * @param startInclusive the start value (inclusive), expected not to be null.446 * @param endInclusive the end value (inclusive), expected not to be null.447 * @return this assertion object.448 * @throws AssertionError if the actual value is {@code null}.449 * @throws NullPointerException if start value is {@code null}.450 * @throws NullPointerException if end value is {@code null}.451 * @throws AssertionError if the actual value is not in [start, end] period.452 * 453 * @since 3.7.1454 */455 public SELF isBetween(LocalTime startInclusive, LocalTime endInclusive) {456 comparables.assertIsBetween(info, actual, startInclusive, endInclusive, true, true);457 return myself;458 }459 /**460 * Same assertion as {@link #isBetween(LocalTime, LocalTime)} but here you pass {@link LocalTime} String representations 461 * which must follow <a href="http://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#ISO_LOCAL_TIME">ISO LocalTime format</a> 462 * to allow calling {@link LocalTime#parse(CharSequence)} method.463 * <p>464 * Example:465 * <pre><code class='java'> LocalTime oneAm = LocalTime.parse("01:00:00");466 * 467 * // assertions succeed:468 * assertThat(oneAm).isBetween("00:59:59", "01:00:01") 469 * .isBetween("01:00:00", "01:00:01") 470 * .isBetween("00:59:59", "01:00:00") 471 * .isBetween("01:00:00", "01:00:00");472 * 473 * // assertion fails:474 * assertThat(oneAm).isBetween("00:59:00", "00:59:59");</code></pre>475 * 476 * @param startInclusive the start value (inclusive), expected not to be null.477 * @param endInclusive the end value (inclusive), expected not to be null.478 * @return this assertion object.479 * 480 * @throws AssertionError if the actual value is {@code null}.481 * @throws NullPointerException if start value is {@code null}.482 * @throws NullPointerException if end value is {@code null}.483 * @throws DateTimeParseException if any of the given String can't be converted to a {@link LocalTime}.484 * @throws AssertionError if the actual value is not in [start, end] period.485 * 486 * @since 3.7.1487 */488 public SELF isBetween(String startInclusive, String endInclusive) {489 return isBetween(parse(startInclusive), parse(endInclusive));490 }491 /**492 * Verifies that the actual {@link LocalTime} is in the ]start, end[ period (start and end excluded).493 * <p>494 * Example:495 * <pre><code class='java'> LocalTime localTime = LocalTime.now();496 * 497 * // assertion succeeds:498 * assertThat(localTime).isStrictlyBetween(localTime.minusSeconds(1), localTime.plusSeconds(1));499 * 500 * // assertions fail:501 * assertThat(localTime).isStrictlyBetween(localTime.minusSeconds(10), localTime.minusSeconds(1));502 * assertThat(localTime).isStrictlyBetween(localTime.plusSeconds(1), localTime.plusSeconds(10));503 * assertThat(localTime).isStrictlyBetween(localTime, localTime.plusSeconds(1));504 * assertThat(localTime).isStrictlyBetween(localTime.minusSeconds(1), localTime);</code></pre>505 * 506 * @param startInclusive the start value (inclusive), expected not to be null.507 * @param endInclusive the end value (inclusive), expected not to be null.508 * @return this assertion object.509 * @throws AssertionError if the actual value is {@code null}.510 * @throws NullPointerException if start value is {@code null}.511 * @throws NullPointerException if end value is {@code null}.512 * @throws AssertionError if the actual value is not in ]start, end[ period.513 * 514 * @since 3.7.1515 */516 public SELF isStrictlyBetween(LocalTime startInclusive, LocalTime endInclusive) {517 comparables.assertIsBetween(info, actual, startInclusive, endInclusive, false, false);518 return myself;519 }520 /**521 * Same assertion as {@link #isStrictlyBetween(LocalTime, LocalTime)} but here you pass {@link LocalTime} String representations 522 * which must follow <a href="http://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#ISO_LOCAL_TIME">ISO LocalTime format</a> 523 * to allow calling {@link LocalTime#parse(CharSequence)} method.524 * <p>525 * Example:526 * <pre><code class='java'> LocalTime oneAm = LocalTime.parse("01:00:00");527 * 528 * // assertion succeeds:529 * assertThat(oneAm).isStrictlyBetween("00:59:59", "01:00:01");530 * 531 * // assertion fails:532 * assertThat(oneAm).isStrictlyBetween("00:59:00", "00:59:59"); 533 * assertThat(oneAm).isStrictlyBetween("01:00:00", "01:00:01"); 534 * assertThat(oneAm).isStrictlyBetween("00:59:59", "01:00:00");</code></pre>535 * 536 * @param startInclusive the start value (inclusive), expected not to be null.537 * @param endInclusive the end value (inclusive), expected not to be null.538 * @return this assertion object.539 * 540 * @throws AssertionError if the actual value is {@code null}.541 * @throws NullPointerException if start value is {@code null}.542 * @throws NullPointerException if end value is {@code null}.543 * @throws DateTimeParseException if any of the given String can't be converted to a {@link LocalTime}.544 * @throws AssertionError if the actual value is not in ]start, end[ period.545 * 546 * @since 3.7.1547 */548 public SELF isStrictlyBetween(String startInclusive, String endInclusive) {549 return isStrictlyBetween(parse(startInclusive), parse(endInclusive));550 }551 /**552 * {@inheritDoc}553 */554 @Override555 protected LocalTime parse(String localTimeAsString) {556 return LocalTime.parse(localTimeAsString);557 }558 /**559 * Returns true if both localtime are in the same year, month and day of month, hour, minute and second, false560 * otherwise.561 *562 * @param actual the actual localtime. expected not be null563 * @param other the other localtime. expected not be null564 * @return true if both localtime are in the same year, month and day of month, hour, minute and second, false565 * otherwise.566 */567 private static boolean areEqualIgnoringNanos(LocalTime actual, LocalTime other) {568 return areEqualIgnoringSeconds(actual, other) && actual.getSecond() == other.getSecond();569 }570 /**571 * Returns true if both localtime are in the same year, month, day of month, hour and minute, false otherwise.572 *573 * @param actual the actual localtime. expected not be null574 * @param other the other localtime. expected not be null575 * @return true if both localtime are in the same year, month, day of month, hour and minute, false otherwise.576 */577 private static boolean areEqualIgnoringSeconds(LocalTime actual, LocalTime other) {578 return haveSameHourField(actual, other) && actual.getMinute() == other.getMinute();579 }580 private static boolean haveSameHourField(LocalTime actual, LocalTime other) {581 return actual.getHour() == other.getHour();...
areEqualIgnoringNanos
Using AI Code Generation
1LocalTime t1 = LocalTime.of(0, 0, 0, 0);2LocalTime t2 = LocalTime.of(0, 0, 0, 1);3assertThat(t1).isNotEqualTo(t2);4assertThat(t1).isNotEqualToIgnoringNanos(t2);5assertThat(t1).isEqualToIgnoringNanos(t1);6LocalDateTime dt1 = LocalDateTime.of(0, 1, 1, 0, 0, 0, 0);7LocalDateTime dt2 = LocalDateTime.of(0, 1, 1, 0, 0, 0, 1);8assertThat(dt1).isNotEqualTo(dt2);9assertThat(dt1).isNotEqualToIgnoringNanos(dt2);10assertThat(dt1).isEqualToIgnoringNanos(dt1);11OffsetDateTime odt1 = OffsetDateTime.of(0, 1, 1, 0, 0, 0, 0, ZoneOffset.UTC);12OffsetDateTime odt2 = OffsetDateTime.of(0, 1, 1, 0, 0, 0, 1, ZoneOffset.UTC);13assertThat(odt1).isNotEqualTo(odt2);14assertThat(odt1).isNotEqualToIgnoringNanos(odt2);15assertThat(odt1).isEqualToIgnoringNanos(odt1);16ZonedDateTime zdt1 = ZonedDateTime.of(0, 1, 1, 0, 0, 0, 0
areEqualIgnoringNanos
Using AI Code Generation
1import static org.assertj.core.api.Assertions.assertThat;2import java.time.LocalTime;3public class LocalTimeAssert_isEqualToIgnoringNanos_Test {4 public void test_isEqualToIgnoringNanos_assertion() {5 LocalTime localTime = LocalTime.of(23, 51, 0, 0);6 assertThat(localTime).isEqualToIgnoringNanos(LocalTime.of(23, 51, 0, 1));7 }8}9 at org.junit.Assert.assertEquals(Assert.java:115)10 at org.junit.Assert.assertEquals(Assert.java:144)11 at com.baeldung.assertj.localtime.LocalTimeAssert_isEqualToIgnoringNanos_Test.test_isEqualToIgnoringNanos_assertion(LocalTimeAssert_isEqualToIgnoringNanos_Test.java:14)12import org.junit.jupiter.api.Test;13import static org.assertj.core.api.Assertions.assertThat;14import java.time.LocalTime;15public class LocalTimeAssert_isEqualToIgnoringNanos_Test {16 public void test_isEqualToIgnoringNanos_assertion() {17 LocalTime localTime = LocalTime.of(23, 51, 0, 0);18 assertThat(localTime).isEqualToIgnoringNanos(LocalTime.of(23, 51, 0, 1));19 }20}21 at org.assertj.core.api.AbstractLocalTimeAssert.isEqualToIgnoringNanos(AbstractLocalTimeAssert.java:276)22 at org.assertj.core.api.AbstractLocalTimeAssert.isEqualToIgnoringNanos(AbstractLocalTimeAssert.java:43)23 at com.baeldung.assertj.localtime.LocalTimeAssert_isEqualToIgnoringNanos_Test.test_isEqualToIgnoringNanos_assertion(LocalTimeAssert_isEqualToIgnoringNanos_Test.java:14)24import org.junit.Test;25import static org.assertj.core.api.Assertions.assertThat;26import java.time.LocalTime;27public class LocalTimeAssert_isEqualToIgnoringNanos_Test {
areEqualIgnoringNanos
Using AI Code Generation
1LocalTime time1 = LocalTime.of(10, 10, 10, 10);2LocalTime time2 = LocalTime.of(10, 10, 10, 11);3assertThat(time1).isNotEqualTo(time2);4assertThat(time1).isEqualToIgnoringNanos(time2);5LocalTime time1 = LocalTime.of(10, 10, 10, 10);6LocalTime time2 = LocalTime.of(10, 10, 10, 11);7assertThat(time1).isNotEqualTo(time2);8assertThat(time1).isEqualToIgnoringNanos(time2);9assertThat(time1).isNotEqualToIgnoringNanos(time2);10assertThat(time1).isEqualToIgnoringNanos(time2);11assertThat(time1).isNotEqualTo(time2);12assertThat(time1).isNotEqualToIgnoringNanos(time2);13assertThat(time1).isEqualToIgnoringNanos(time2);14assertThat(time1).isNotEqualTo(time2);15assertThat(time1).isNotEqualToIgnoringNanos(time2);16assertThat(time1).isEqualToIgnoringNanos(time2);17assertThat(time1).isNotEqualTo(time2);18assertThat(time1).isNotEqualToIgnoringNanos(time2);19assertThat(time1).isEqualToIgnoringNanos(time2);20assertThat(time1).isNotEqualTo(time2);21assertThat(time1).isNotEqualToIgnoringNanos(time2);22assertThat(time1).isEqualToIgnoringNanos(time2);23assertThat(time1).isNotEqualTo(time2);24assertThat(time1).isNotEqualToIgnoringNanos(time2);25assertThat(time1).isEqualToIgnoringNanos(time2);26assertThat(time1).isNotEqualTo(time2);27assertThat(time1).isNotEqualToIgnoringNanos(time2);28assertThat(time1).isEqualToIgnoringNanos(time2);29assertThat(time1).isNotEqualTo(time2);30assertThat(time1).isNotEqualToIgnoringNanos(time2);31assertThat(time1).isEqualToIgnoringNanos(time2);32assertThat(time1).isNotEqualTo(time2);33assertThat(time1).isNotEqualToIgnoringNanos(time2);34assertThat(time1).isEqualToIgnoringNanos(time2);35assertThat(time1).isNotEqualTo(time2);36assertThat(time1).isNotEqualToIgnoringNanos(time2);37assertThat(time1).isEqualToIgnoringNanos(time2);38assertThat(time1).isNotEqualTo(time2);
areEqualIgnoringNanos
Using AI Code Generation
1import org.junit.Test;2import org.junit.runner.RunWith;3import org.springframework.beans.factory.annotation.Autowired;4import org.springframework.boot.test.context.SpringBootTest;5import org.springframework.test.context.junit4.SpringRunner;6import static org.assertj.core.api.Assertions.assertThat;7@RunWith(SpringRunner.class)8public class TimeTest {9 private Time time;10 public void testTime() {11 assertThat(time.getNow()).isNotNull();12 assertThat(time.getNow()).isInstanceOf(LocalTime.class);13 assertThat(time.getNow()).isEqualToIgnoringNanos(LocalTime.now());14 }15}16[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ time ---17[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ time ---18[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ time ---19[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ time ---20[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ time ---
areEqualIgnoringNanos
Using AI Code Generation
1LocalTime time1 = LocalTime.of(12, 30, 20, 0);2LocalTime time2 = LocalTime.of(12, 30, 20, 100);3LocalTime time3 = LocalTime.of(12, 30, 20, 200);4LocalTime time4 = LocalTime.of(12, 30, 20, 300);5LocalTime time5 = LocalTime.of(12, 30, 20, 400);6LocalTime time6 = LocalTime.of(12, 30, 20, 500);7LocalTime time7 = LocalTime.of(12, 30, 20, 600);8LocalTime time8 = LocalTime.of(12, 30, 20, 700);9LocalTime time9 = LocalTime.of(12, 30, 20, 800);10LocalTime time10 = LocalTime.of(12, 30, 20, 900);11LocalTime time11 = LocalTime.of(12, 30, 20, 999);12LocalTime time12 = LocalTime.of(12, 30, 21, 0);13assertThat(time1).as("time1 is equal to time2").isEqualToIgnoringNanos(time2);14assertThat(time1).as("time1 is equal to time3").isEqualToIgnoringNanos(time3);15assertThat(time1).as("time1 is equal to time4").isEqualToIgnoringNanos(time4);16assertThat(time1).as("time1 is equal to time5").isEqualToIgnoringNanos(time5);17assertThat(time1).as("time1 is equal to time6").isEqualToIgnoringNanos(time6);18assertThat(time1).as("time1 is equal to time7").isEqualToIgnoringNanos(time7);19assertThat(time1).as("time1 is equal to time8").isEqualToIgnoringNanos(time8);20assertThat(time1).as("time1 is equal to time9").isEqualToIgnoringNanos(time9);21assertThat(time1).as("time1 is equal to time10").isEqualToIgnoringNanos(time10);22assertThat(time1).as("time1 is equal to time11").isEqualToIgnoringNanos(time11);23assertThat(time1).as("time1 is not equal to time12").isNotEqualToIgnoringNanos(time12);
areEqualIgnoringNanos
Using AI Code Generation
1import java.time.LocalTime;2import java.time.format.DateTimeFormatter;3import org.assertj.core.api.Assertions;4import org.junit.jupiter.api.Test;5public class AssertJLocalTimeAssertTest {6 public void testLocalTimeAssert() {7 LocalTime localTime1 = LocalTime.parse("20:00:00", DateTimeFormatter.ofPattern("HH:mm:ss"));8 LocalTime localTime2 = LocalTime.parse("20:00:00.000001", DateTimeFormatter.ofPattern("HH:mm:ss.SSSSSS"));9 LocalTime localTime3 = LocalTime.parse("20:00:01", DateTimeFormatter.ofPattern("HH:mm:ss"));10 LocalTime localTime4 = LocalTime.parse("20:00:00.000001", DateTimeFormatter.ofPattern("HH:mm:ss.SSSSSS"));11 Assertions.assertThat(localTime1).isNotEqualTo(localTime2);12 Assertions.assertThat(localTime1).isNotEqualTo(localTime3);13 Assertions.assertThat(localTime2).isNotEqualTo(localTime3);14 Assertions.assertThat(localTime2).isEqualToIgnoringNanos(localTime4);15 }16}
areEqualIgnoringNanos
Using AI Code Generation
1import static java.time.LocalTime.of;2import java.time.LocalTime;3import org.assertj.core.api.Assertions;4public class AssertjLocalTimeAssertTest {5 public static void main(String[] args) {6 LocalTime time1 = of(12, 00, 00, 000000000);7 LocalTime time2 = of(12, 00, 00, 000000001);8 Assertions.assertThat(time1).isNotEqualTo(time2);9 Assertions.assertThat(time1).isNotEqualToIgnoringNanos(time2);10 }11}
areEqualIgnoringNanos
Using AI Code Generation
1LocalTime time = LocalTime.of(10, 30, 40, 999999999);2LocalTime otherTime = LocalTime.of(10, 30, 40, 999999999);3LocalTime timeWithDifferentNano = LocalTime.of(10, 30, 40, 999999998);4assertThat(time).isNotEqualTo(otherTime);5assertThat(time).isNotEqualTo(timeWithDifferentNano);6assertThat(time).isNotEqualTo(null);7assertThat(time).isNotEqualTo("10:30:40.999999999");8assertThat(time).isNotEqualTo(Instant.now());9assertThat(time).isNotEqualTo(LocalDate.now());10assertThat(time).isNotEqualTo(LocalDateTime.now());11assertThat(time).isNotEqualTo(ZonedDateTime.now());12assertThat(time).isNotEqualTo(OffsetDateTime.now());13assertThat(time).isNotEqualTo(OffsetTime.now());14assertThat(time).isNotEqualTo(ZoneOffset.UTC);15assertThat(time).isNotEqualTo(ZoneId.systemDefault());16assertThat(time).isNotEqualTo(Period.ofDays(1));17assertThat(time).isNotEqualTo(Duration.ofDays(1));18assertThat(time).isNotEqualTo(ChronoUnit.DAYS);19assertThat(time).isNotEqualTo(ChronoField.ALIGNED_WEEK_OF_MONTH);20assertThat(time).isNotEqualTo(ChronoField.ALIGNED_WEEK_OF_YEAR);21assertThat(time).isNotEqualTo(ChronoField.AMPM_OF_DAY);22assertThat(time).isNotEqualTo(ChronoField.CLOCK_HOUR_OF_DAY);23assertThat(time).isNotEqualTo(ChronoField.CLOCK_HOUR_OF_AMPM);24assertThat(time).isNotEqualTo(ChronoField.DAY_OF_MONTH);25assertThat(time).isNotEqualTo(ChronoField.DAY_OF_WEEK);26assertThat(time).isNotEqualTo(ChronoField.DAY_OF_YEAR);27assertThat(time).isNotEqualTo(ChronoField.EPOCH_DAY);28assertThat(time).isNotEqualTo(ChronoField.ERA);29assertThat(time).isNotEqualTo(ChronoField.HOUR_OF_AMPM);30assertThat(time).isNotEqualTo(ChronoField.HOUR_OF_DAY);31assertThat(time).isNotEqualTo(ChronoField.INSTANT_SECONDS);32assertThat(time).isNotEqualTo(ChronoField.MICRO_OF_DAY);33assertThat(time).isNotEqualTo(ChronoField.MICRO_OF_SECOND);34assertThat(time).isNotEqualTo(
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!