Author: bleny Date: 2013-04-25 14:57:51 +0200 (Thu, 25 Apr 2013) New Revision: 132 Url: http://forge.codelutin.com/projects/franciaflex-magalie/repository/revisions... Log: fix enormous problem using priorityQueue#iterator, replace by treeSets Added: trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/ArticleStorageServiceTest.java trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/OldFixturesArticleStorageServiceTest.java Removed: trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/ArticleStorageServiceTest.java Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/StoredArticles.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/ArticleStorageService.java trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/RequestedArticleService.java trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/RequestedArticleServiceTest.java Modified: trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/StoredArticles.java =================================================================== --- trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/StoredArticles.java 2013-04-25 11:08:52 UTC (rev 131) +++ trunk/magalie-persistence/src/main/java/com/franciaflex/magalie/persistence/StoredArticles.java 2013-04-25 12:57:51 UTC (rev 132) @@ -24,8 +24,8 @@ */ import com.franciaflex.magalie.persistence.entity.Article; +import com.franciaflex.magalie.persistence.entity.Location; import com.franciaflex.magalie.persistence.entity.MagalieUser; -import com.franciaflex.magalie.persistence.entity.Location; import com.franciaflex.magalie.persistence.entity.StoredArticle; import com.google.common.base.Function; import com.google.common.base.Preconditions; @@ -40,7 +40,7 @@ public class StoredArticles { /** - * Put fixed sites for given article first, or last according to the value of + * Put fixed sites for given article first, or ignore it according to the value of * {@link com.franciaflex.magalie.persistence.entity.Article#isFixedLocationsFirst()} */ protected static class FixedLocationForArticle implements Comparator<StoredArticle> { @@ -51,7 +51,13 @@ Preconditions.checkArgument(article.equals(y.getArticle())); boolean xIsInFixedLocation = article.isFixedLocation(x.getLocation()); boolean yIsInFixedLocation = article.isFixedLocation(y.getLocation()); - return BooleanComparator.getBooleanComparator( ! article.isFixedLocationsFirst()).compare(xIsInFixedLocation, yIsInFixedLocation); + int compare; + if (article.isFixedLocationsFirst()) { + compare = BooleanComparator.getTrueFirstComparator().compare(xIsInFixedLocation, yIsInFixedLocation); + } else { + compare = 0; + } + return compare; } } @@ -60,7 +66,8 @@ @Override public int compare(StoredArticle o1, StoredArticle o2) { - return Double.compare(o1.getQuantity(), o2.getQuantity()); + int compare = Double.compare(o2.getQuantity(), o1.getQuantity()); + return compare; } } @@ -110,7 +117,7 @@ } public static Comparator<StoredArticle> locationWithLowestQuantityFirstComparator() { - return Ordering.from(new LocationWithHighestQuantityFirst()).reverse(); + return Ordering.from(locationWithHighestQuantityFirst()).reverse(); } @@ -119,7 +126,7 @@ } public static Comparator<StoredArticle> fixedLocationForArticleComparator() { - return Ordering.from(new FixedLocationForArticle()).reverse(); + return new FixedLocationForArticle(); } public static Function<StoredArticle, Location> getLocationFunction() { Modified: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/ArticleStorageService.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/ArticleStorageService.java 2013-04-25 11:08:52 UTC (rev 131) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/ArticleStorageService.java 2013-04-25 12:57:51 UTC (rev 132) @@ -48,6 +48,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Ordering; +import com.google.common.collect.Sets; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -56,8 +57,6 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; -import java.util.PriorityQueue; -import java.util.Queue; import java.util.Set; public class ArticleStorageService implements MagalieService { @@ -90,7 +89,7 @@ List<StoredArticle> storedArticles = getStoredArticles(bookArticleRequest.getBuilding(), article); - Queue<StoredArticle> sortedStoredArticles = sortStoredArticlesByPriority(storedArticles); + Set<StoredArticle> sortedStoredArticles = sortStoredArticlesByPriority(storedArticles); BookArticleResult bookArticleResult = buildStorageMovementOrder(bookArticleRequest, sortedStoredArticles); @@ -163,7 +162,7 @@ } - protected BookArticleResult buildStorageMovementOrder(BookArticleRequest bookArticleRequest, Queue<StoredArticle> sortedStoredArticles) { + protected BookArticleResult buildStorageMovementOrder(BookArticleRequest bookArticleRequest, Set<StoredArticle> sortedStoredArticles) { Article article = bookArticleRequest.getArticle(); @@ -252,29 +251,20 @@ } - protected Queue<StoredArticle> sortStoredArticlesByPriority(List<StoredArticle> storedArticles) { + protected Set<StoredArticle> sortStoredArticlesByPriority(List<StoredArticle> storedArticles) { - Queue<StoredArticle> storedArticlesByPriority = Lists.newLinkedList(); + Ordering<StoredArticle> orderingByPriority = + Ordering.compound( + Lists.newArrayList( + StoredArticles.fixedLocationForArticleComparator(), + StoredArticles.locationWithLowestQuantityFirstComparator() + //StoredArticles.articleStoredInLocationsRequiringDriverLicenseFirstComparator() + ) + ); - if ( ! storedArticles.isEmpty()) { + Set<StoredArticle> storedArticlesByPriority = + Sets.newTreeSet(orderingByPriority); - Ordering<StoredArticle> orderingByPriority = - Ordering.compound( - Lists.newArrayList( - StoredArticles.fixedLocationForArticleComparator(), - StoredArticles.locationWithLowestQuantityFirstComparator(), - StoredArticles.articleStoredInLocationsRequiringDriverLicenseFirstComparator() - ) - ); - - storedArticlesByPriority = - new PriorityQueue<StoredArticle>( - storedArticles.size(), - orderingByPriority - ); - - } - storedArticlesByPriority.addAll(storedArticles); return storedArticlesByPriority; Modified: trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/RequestedArticleService.java =================================================================== --- trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/RequestedArticleService.java 2013-04-25 11:08:52 UTC (rev 131) +++ trunk/magalie-services/src/main/java/com/franciaflex/magalie/services/service/RequestedArticleService.java 2013-04-25 12:57:51 UTC (rev 132) @@ -43,14 +43,14 @@ import com.franciaflex.magalie.services.MagalieServiceContext; import com.google.common.base.Preconditions; import com.google.common.collect.Iterables; +import com.google.common.collect.Sets; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.util.Comparator; import java.util.Iterator; import java.util.List; -import java.util.PriorityQueue; -import java.util.Queue; +import java.util.Set; public class RequestedArticleService implements MagalieService { @@ -66,7 +66,7 @@ List<RequestedArticle> requestedArticles = getRequestedArticles(building, magalieUser); - Queue<RequestedArticle> requestedArticlesByPriority = getRequestedArticlesByPriority(requestedArticles, magalieUser); + Set<RequestedArticle> requestedArticlesByPriority = getRequestedArticlesByPriority(requestedArticles, magalieUser); FindOrderToExecuteResult findOrderToExecuteResult = findOrderToExecute( @@ -92,7 +92,7 @@ } - protected FindOrderToExecuteResult findOrderToExecute(Queue<RequestedArticle> requestedArticlesByPriority, MagalieUser magalieUser, Building building) { + protected FindOrderToExecuteResult findOrderToExecute(Set<RequestedArticle> requestedArticlesByPriority, MagalieUser magalieUser, Building building) { ArticleStorageService articleStorageService = serviceContext.newService(ArticleStorageService.class); @@ -281,39 +281,31 @@ } - protected Queue<RequestedArticle> getRequestedArticlesByPriority(List<RequestedArticle> requests, MagalieUser magalieUser) { + protected Set<RequestedArticle> getRequestedArticlesByPriority(List<RequestedArticle> requests, MagalieUser magalieUser) { - PriorityQueue<RequestedArticle> requestedArticles = new PriorityQueue<RequestedArticle>(); + MagaliePersistenceContext persistenceContext = serviceContext.getPersistenceContext(); - if ( ! requests.isEmpty()) { + DeliveredRequestedListDao deliveredRequestedListDao = persistenceContext.getDeliveredRequestedListDao(); - MagaliePersistenceContext persistenceContext = serviceContext.getPersistenceContext(); + DeliveredRequestedList affectedDeliveredRequestedList = + deliveredRequestedListDao.findByAffectedTo(magalieUser); - DeliveredRequestedListDao deliveredRequestedListDao = persistenceContext.getDeliveredRequestedListDao(); + RequestedList affectedRequestedList = null; - DeliveredRequestedList affectedDeliveredRequestedList = - deliveredRequestedListDao.findByAffectedTo(magalieUser); + if (affectedDeliveredRequestedList != null) { - RequestedList affectedRequestedList = null; + affectedRequestedList = affectedDeliveredRequestedList.getRequestedList(); - if (affectedDeliveredRequestedList != null) { + } - affectedRequestedList = affectedDeliveredRequestedList.getRequestedList(); + Comparator<RequestedArticle> priorityComparator = + RequestedArticles.comparator(requests, affectedRequestedList); - } + Set<RequestedArticle> requestedArticles = + Sets.newTreeSet(priorityComparator); - Comparator<RequestedArticle> priorityComparator = - RequestedArticles.comparator(requests, affectedRequestedList); + requestedArticles.addAll(requests); - requestedArticles = - new PriorityQueue<RequestedArticle>( - requests.size(), - priorityComparator); - - requestedArticles.addAll(requests); - - } - return requestedArticles; } Deleted: trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/ArticleStorageServiceTest.java =================================================================== --- trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/ArticleStorageServiceTest.java 2013-04-25 11:08:52 UTC (rev 131) +++ trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/ArticleStorageServiceTest.java 2013-04-25 12:57:51 UTC (rev 132) @@ -1,232 +0,0 @@ -package com.franciaflex.magalie.services.service; - -/* - * #%L - * MagaLiE :: Services - * $Id:$ - * $HeadURL:$ - * %% - * Copyright (C) 2013 CodeLutin - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * #L% - */ - -import com.franciaflex.magalie.persistence.entity.Article; -import com.franciaflex.magalie.persistence.entity.Building; -import com.franciaflex.magalie.persistence.entity.Location; -import com.franciaflex.magalie.persistence.entity.MagalieUser; -import com.franciaflex.magalie.persistence.entity.StorageMovement; -import com.franciaflex.magalie.persistence.entity.StorageMovementOrder; -import com.franciaflex.magalie.services.AbstractMagalieServiceTest; -import com.google.common.collect.Iterables; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import java.text.ParseException; -import java.util.Date; - -public class ArticleStorageServiceTest extends AbstractMagalieServiceTest { - - private static final Log log = LogFactory.getLog(ArticleStorageServiceTest.class); - - protected ArticleStorageService service; - - protected Building building; - - protected Location destinationLocation; - - @Before - public void setUp() throws ParseException { - - loadFixtures("fixtures2"); - - building = fixture("B1"); - - destinationLocation = fixture("location5"); - - service = newService(ArticleStorageService.class); - - serviceContext.setDate(new Date(1363948427576l)); - - } - - @Test - public void testThrowUnavailableArticle() throws Exception { - - MagalieUser alexandre = fixture("alexandre"); - Article article = fixture("article1"); - - BookArticleRequest bookArticleRequest = new BookArticleRequest(alexandre, building, article, 100., destinationLocation, false); - - BookArticleResult bookArticleResult = service.bookArticle(bookArticleRequest); - - Assert.assertFalse(bookArticleResult.isSuccess()); - - Assert.assertTrue(bookArticleResult.isArticleUnavailable()); - - } - - @Test - public void testThrowRequiredDriverLicenceException() throws Exception { - - MagalieUser basile = fixture("basile"); - Article article = fixture("article1"); - - BookArticleRequest bookArticleRequest = new BookArticleRequest(basile, building, article, 70., destinationLocation, false); - - BookArticleResult bookArticleResult = service.bookArticle(bookArticleRequest); - - Assert.assertFalse(bookArticleResult.isSuccess()); - Assert.assertTrue(bookArticleResult.isArticleInaccessible()); - Assert.assertFalse(bookArticleResult.isArticleUnavailable()); - - } - - @Test - public void testWithdrawArticleWithoutDriverLicense() throws Exception { - - MagalieUser basile = fixture("basile"); - Article article = fixture("article2"); - - BookArticleRequest bookArticleRequest = new BookArticleRequest(basile, building, article, 5., destinationLocation, false); - - BookArticleResult bookArticleResult = service.bookArticle(bookArticleRequest); - - Assert.assertTrue(bookArticleResult.isSuccess()); - Assert.assertFalse(bookArticleResult.isArticleUnavailable()); - Assert.assertFalse(bookArticleResult.isArticleInaccessible()); - - Assert.assertEquals(1, bookArticleResult.getStorageMovementOrder().getStorageMovements().size()); - - } - - @Test - public void testWithdrawArticleWithDriverLicense() throws Exception { - - MagalieUser alexandre = fixture("alexandre"); - Article article = fixture("article1"); - - BookArticleRequest bookArticleRequest = new BookArticleRequest(alexandre, building, article, 50., destinationLocation, false); - BookArticleResult bookArticleResult = service.bookArticle(bookArticleRequest); - - Assert.assertTrue(bookArticleResult.isSuccess()); - Assert.assertFalse(bookArticleResult.isArticleUnavailable()); - Assert.assertFalse(bookArticleResult.isArticleInaccessible()); - - StorageMovementOrder storageMovementOrder = bookArticleResult.getStorageMovementOrder(); - Assert.assertEquals(2, storageMovementOrder.getStorageMovements().size()); - StorageMovement location1 = Iterables.get(storageMovementOrder.getStorageMovements(), 0, null); - Assert.assertEquals(20., location1.getExpectedQuantity(), DELTA); - StorageMovement location2 = Iterables.get(storageMovementOrder.getStorageMovements(), 1, null); - Assert.assertEquals(30., location2.getExpectedQuantity(), DELTA); - - } - - @Test - public void testWithdrawArticleConsiderAlreadyRemovedItem() throws Exception { - - MagalieUser alexandre = fixture("alexandre"); - MagalieUser cathy = fixture("cathy"); - - Article article = fixture("article1"); - - { - BookArticleRequest bookArticleRequest = new BookArticleRequest(alexandre, building, article, 30., destinationLocation, false); - BookArticleResult bookArticleResult = service.bookArticle(bookArticleRequest); - StorageMovementOrder storageMovementOrder = bookArticleResult.getStorageMovementOrder(); - - Assert.assertTrue(bookArticleResult.isSuccess()); - Assert.assertFalse(bookArticleResult.isArticleUnavailable()); - Assert.assertFalse(bookArticleResult.isArticleInaccessible()); - Assert.assertEquals(2, storageMovementOrder.getStorageMovements().size()); - StorageMovement storageMovement1 = Iterables.get(storageMovementOrder.getStorageMovements(), 0, null); - Assert.assertEquals(20., storageMovement1.getExpectedQuantity(), DELTA); - Assert.assertEquals("B2", storageMovement1.getOriginLocation().getCode()); - StorageMovement storageMovement2 = Iterables.get(storageMovementOrder.getStorageMovements(), 1, null); - Assert.assertEquals(10., storageMovement2.getExpectedQuantity(), DELTA); - Assert.assertEquals("A1", storageMovement2.getOriginLocation().getCode()); - } - - { - - BookArticleRequest bookArticleRequest = new BookArticleRequest(cathy, building, article, 30., destinationLocation, false); - BookArticleResult bookArticleResult = service.bookArticle(bookArticleRequest); - StorageMovementOrder storageMovementOrder = bookArticleResult.getStorageMovementOrder(); - - Assert.assertTrue(bookArticleResult.isSuccess()); - Assert.assertFalse(bookArticleResult.isArticleUnavailable()); - Assert.assertFalse(bookArticleResult.isArticleInaccessible()); - Assert.assertEquals(1, storageMovementOrder.getStorageMovements().size()); - StorageMovement storageMovement = Iterables.get(storageMovementOrder.getStorageMovements(), 0, null); - Assert.assertEquals(30., storageMovement.getExpectedQuantity(), DELTA); - Assert.assertEquals("A1", storageMovement.getOriginLocation().getCode()); - } - } - - @Test - public void testWithdrawArticleConsiderLocationsInError() throws Exception { - - MagalieUser alexandre = fixture("alexandre"); - MagalieUser cathy = fixture("cathy"); - - Article article = fixture("article1"); - - // report location 2 in error - Location location2 = fixture("location2"); - LocationErrorsService locationErrorsService = newService(LocationErrorsService.class); - locationErrorsService.reportError(location2, article, alexandre); - - BookArticleRequest bookArticleRequest = new BookArticleRequest(cathy, building, article, 30., destinationLocation, false); - BookArticleResult bookArticleResult = service.bookArticle(bookArticleRequest); - StorageMovementOrder storageMovementOrder = bookArticleResult.getStorageMovementOrder(); - - Assert.assertTrue(bookArticleResult.isSuccess()); - Assert.assertFalse(bookArticleResult.isArticleUnavailable()); - Assert.assertFalse(bookArticleResult.isArticleInaccessible()); - - Assert.assertEquals(1, storageMovementOrder.getStorageMovements().size()); - StorageMovement storageMovement = Iterables.get(storageMovementOrder.getStorageMovements(), 0, null); - Assert.assertNotEquals( - "location2 must not be returned because it was reported in error", - location2.getId(), - storageMovement.getOriginLocation().getId()); - - } - - @Test - public void testWithdrawArticleWithBestEffortPolicy() throws Exception { - - MagalieUser alexandre = fixture("alexandre"); - Article article = fixture("article2"); - Location location1 = fixture("location1"); - - BookArticleRequest bookArticleRequest = new BookArticleRequest(alexandre, building, article, 30., destinationLocation, true); - BookArticleResult bookArticleResult = service.bookArticle(bookArticleRequest); - StorageMovementOrder storageMovementOrder = bookArticleResult.getStorageMovementOrder(); - - Assert.assertTrue(bookArticleResult.isSuccess()); - Assert.assertFalse(bookArticleResult.isArticleUnavailable()); - Assert.assertFalse(bookArticleResult.isArticleInaccessible()); - Assert.assertEquals(1, storageMovementOrder.getStorageMovements().size()); - StorageMovement storageMovement = Iterables.get(storageMovementOrder.getStorageMovements(), 0, null); - Assert.assertEquals("only 10 is available, so don't propose more", 10., storageMovement.getQuantity(), DELTA); - Assert.assertEquals(location1.getId(), storageMovement.getOriginLocation().getId()); - - } - -} Added: trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/ArticleStorageServiceTest.java =================================================================== --- trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/ArticleStorageServiceTest.java (rev 0) +++ trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/ArticleStorageServiceTest.java 2013-04-25 12:57:51 UTC (rev 132) @@ -0,0 +1,70 @@ +package com.franciaflex.magalie.services.service; + +import com.franciaflex.magalie.persistence.entity.Article; +import com.franciaflex.magalie.persistence.entity.Building; +import com.franciaflex.magalie.persistence.entity.Location; +import com.franciaflex.magalie.persistence.entity.MagalieUser; +import com.franciaflex.magalie.persistence.entity.StorageMovement; +import com.franciaflex.magalie.services.AbstractMagalieServiceTest; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.text.ParseException; +import java.util.Date; +import java.util.List; + +public class ArticleStorageServiceTest extends AbstractMagalieServiceTest { + + private static final Log log = LogFactory.getLog(ArticleStorageServiceTest.class); + + protected ArticleStorageService service; + + protected Building building; + + protected Location destinationLocation; + + protected MagalieUser magalieUser; + + @Before + public void setUp() throws ParseException { + + loadFixtures("fixtures"); + + building = fixture("B1"); + + destinationLocation = fixture("location5"); + + magalieUser = fixture("bruno"); + + service = newService(ArticleStorageService.class); + + serviceContext.setDate(new Date(1363948427576l)); + + } + + /** + * Checks that lowest quantity first policy is applied and fixed location first = false + * is considered. + */ + @Test + public void testOrder() { + + Article article = fixture("article2"); + + BookArticleRequest bookArticleRequest = + new BookArticleRequest(magalieUser, building, article, 11., destinationLocation, false); + + BookArticleResult bookArticleResult = service.bookArticle(bookArticleRequest); + + Assert.assertTrue(bookArticleResult.isSuccess()); + + List<StorageMovement> storageMovements = bookArticleResult.getStorageMovementOrder().getStorageMovements(); + + Assert.assertEquals(2., storageMovements.get(0).getExpectedQuantity(), DELTA); + Assert.assertEquals(9., storageMovements.get(1).getExpectedQuantity(), DELTA); + + } +} Copied: trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/OldFixturesArticleStorageServiceTest.java (from rev 130, trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/ArticleStorageServiceTest.java) =================================================================== --- trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/OldFixturesArticleStorageServiceTest.java (rev 0) +++ trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/OldFixturesArticleStorageServiceTest.java 2013-04-25 12:57:51 UTC (rev 132) @@ -0,0 +1,232 @@ +package com.franciaflex.magalie.services.service; + +/* + * #%L + * MagaLiE :: Services + * $Id:$ + * $HeadURL:$ + * %% + * Copyright (C) 2013 CodeLutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * #L% + */ + +import com.franciaflex.magalie.persistence.entity.Article; +import com.franciaflex.magalie.persistence.entity.Building; +import com.franciaflex.magalie.persistence.entity.Location; +import com.franciaflex.magalie.persistence.entity.MagalieUser; +import com.franciaflex.magalie.persistence.entity.StorageMovement; +import com.franciaflex.magalie.persistence.entity.StorageMovementOrder; +import com.franciaflex.magalie.services.AbstractMagalieServiceTest; +import com.google.common.collect.Iterables; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.text.ParseException; +import java.util.Date; + +public class OldFixturesArticleStorageServiceTest extends AbstractMagalieServiceTest { + + private static final Log log = LogFactory.getLog(OldFixturesArticleStorageServiceTest.class); + + protected ArticleStorageService service; + + protected Building building; + + protected Location destinationLocation; + + @Before + public void setUp() throws ParseException { + + loadFixtures("fixtures2"); + + building = fixture("B1"); + + destinationLocation = fixture("location5"); + + service = newService(ArticleStorageService.class); + + serviceContext.setDate(new Date(1363948427576l)); + + } + + @Test + public void testThrowUnavailableArticle() throws Exception { + + MagalieUser alexandre = fixture("alexandre"); + Article article = fixture("article1"); + + BookArticleRequest bookArticleRequest = new BookArticleRequest(alexandre, building, article, 100., destinationLocation, false); + + BookArticleResult bookArticleResult = service.bookArticle(bookArticleRequest); + + Assert.assertFalse(bookArticleResult.isSuccess()); + + Assert.assertTrue(bookArticleResult.isArticleUnavailable()); + + } + + @Test + public void testThrowRequiredDriverLicenceException() throws Exception { + + MagalieUser basile = fixture("basile"); + Article article = fixture("article1"); + + BookArticleRequest bookArticleRequest = new BookArticleRequest(basile, building, article, 70., destinationLocation, false); + + BookArticleResult bookArticleResult = service.bookArticle(bookArticleRequest); + + Assert.assertFalse(bookArticleResult.isSuccess()); + Assert.assertTrue(bookArticleResult.isArticleInaccessible()); + Assert.assertFalse(bookArticleResult.isArticleUnavailable()); + + } + + @Test + public void testWithdrawArticleWithoutDriverLicense() throws Exception { + + MagalieUser basile = fixture("basile"); + Article article = fixture("article2"); + + BookArticleRequest bookArticleRequest = new BookArticleRequest(basile, building, article, 5., destinationLocation, false); + + BookArticleResult bookArticleResult = service.bookArticle(bookArticleRequest); + + Assert.assertTrue(bookArticleResult.isSuccess()); + Assert.assertFalse(bookArticleResult.isArticleUnavailable()); + Assert.assertFalse(bookArticleResult.isArticleInaccessible()); + + Assert.assertEquals(1, bookArticleResult.getStorageMovementOrder().getStorageMovements().size()); + + } + + @Test + public void testWithdrawArticleWithDriverLicense() throws Exception { + + MagalieUser alexandre = fixture("alexandre"); + Article article = fixture("article1"); + + BookArticleRequest bookArticleRequest = new BookArticleRequest(alexandre, building, article, 50., destinationLocation, false); + BookArticleResult bookArticleResult = service.bookArticle(bookArticleRequest); + + Assert.assertTrue(bookArticleResult.isSuccess()); + Assert.assertFalse(bookArticleResult.isArticleUnavailable()); + Assert.assertFalse(bookArticleResult.isArticleInaccessible()); + + StorageMovementOrder storageMovementOrder = bookArticleResult.getStorageMovementOrder(); + Assert.assertEquals(2, storageMovementOrder.getStorageMovements().size()); + StorageMovement location1 = Iterables.get(storageMovementOrder.getStorageMovements(), 0, null); + Assert.assertEquals(20., location1.getExpectedQuantity(), DELTA); + StorageMovement location2 = Iterables.get(storageMovementOrder.getStorageMovements(), 1, null); + Assert.assertEquals(30., location2.getExpectedQuantity(), DELTA); + + } + + @Test + public void testWithdrawArticleConsiderAlreadyRemovedItem() throws Exception { + + MagalieUser alexandre = fixture("alexandre"); + MagalieUser cathy = fixture("cathy"); + + Article article = fixture("article1"); + + { + BookArticleRequest bookArticleRequest = new BookArticleRequest(alexandre, building, article, 30., destinationLocation, false); + BookArticleResult bookArticleResult = service.bookArticle(bookArticleRequest); + StorageMovementOrder storageMovementOrder = bookArticleResult.getStorageMovementOrder(); + + Assert.assertTrue(bookArticleResult.isSuccess()); + Assert.assertFalse(bookArticleResult.isArticleUnavailable()); + Assert.assertFalse(bookArticleResult.isArticleInaccessible()); + Assert.assertEquals(2, storageMovementOrder.getStorageMovements().size()); + StorageMovement storageMovement1 = Iterables.get(storageMovementOrder.getStorageMovements(), 0, null); + Assert.assertEquals(20., storageMovement1.getExpectedQuantity(), DELTA); + Assert.assertEquals("B2", storageMovement1.getOriginLocation().getCode()); + StorageMovement storageMovement2 = Iterables.get(storageMovementOrder.getStorageMovements(), 1, null); + Assert.assertEquals(10., storageMovement2.getExpectedQuantity(), DELTA); + Assert.assertEquals("A1", storageMovement2.getOriginLocation().getCode()); + } + + { + + BookArticleRequest bookArticleRequest = new BookArticleRequest(cathy, building, article, 30., destinationLocation, false); + BookArticleResult bookArticleResult = service.bookArticle(bookArticleRequest); + StorageMovementOrder storageMovementOrder = bookArticleResult.getStorageMovementOrder(); + + Assert.assertTrue(bookArticleResult.isSuccess()); + Assert.assertFalse(bookArticleResult.isArticleUnavailable()); + Assert.assertFalse(bookArticleResult.isArticleInaccessible()); + Assert.assertEquals(1, storageMovementOrder.getStorageMovements().size()); + StorageMovement storageMovement = Iterables.get(storageMovementOrder.getStorageMovements(), 0, null); + Assert.assertEquals(30., storageMovement.getExpectedQuantity(), DELTA); + Assert.assertEquals("A1", storageMovement.getOriginLocation().getCode()); + } + } + + @Test + public void testWithdrawArticleConsiderLocationsInError() throws Exception { + + MagalieUser alexandre = fixture("alexandre"); + MagalieUser cathy = fixture("cathy"); + + Article article = fixture("article1"); + + // report location 2 in error + Location location2 = fixture("location2"); + LocationErrorsService locationErrorsService = newService(LocationErrorsService.class); + locationErrorsService.reportError(location2, article, alexandre); + + BookArticleRequest bookArticleRequest = new BookArticleRequest(cathy, building, article, 30., destinationLocation, false); + BookArticleResult bookArticleResult = service.bookArticle(bookArticleRequest); + StorageMovementOrder storageMovementOrder = bookArticleResult.getStorageMovementOrder(); + + Assert.assertTrue(bookArticleResult.isSuccess()); + Assert.assertFalse(bookArticleResult.isArticleUnavailable()); + Assert.assertFalse(bookArticleResult.isArticleInaccessible()); + + Assert.assertEquals(1, storageMovementOrder.getStorageMovements().size()); + StorageMovement storageMovement = Iterables.get(storageMovementOrder.getStorageMovements(), 0, null); + Assert.assertNotEquals( + "location2 must not be returned because it was reported in error", + location2.getId(), + storageMovement.getOriginLocation().getId()); + + } + + @Test + public void testWithdrawArticleWithBestEffortPolicy() throws Exception { + + MagalieUser alexandre = fixture("alexandre"); + Article article = fixture("article2"); + Location location1 = fixture("location1"); + + BookArticleRequest bookArticleRequest = new BookArticleRequest(alexandre, building, article, 30., destinationLocation, true); + BookArticleResult bookArticleResult = service.bookArticle(bookArticleRequest); + StorageMovementOrder storageMovementOrder = bookArticleResult.getStorageMovementOrder(); + + Assert.assertTrue(bookArticleResult.isSuccess()); + Assert.assertFalse(bookArticleResult.isArticleUnavailable()); + Assert.assertFalse(bookArticleResult.isArticleInaccessible()); + Assert.assertEquals(1, storageMovementOrder.getStorageMovements().size()); + StorageMovement storageMovement = Iterables.get(storageMovementOrder.getStorageMovements(), 0, null); + Assert.assertEquals("only 10 is available, so don't propose more", 10., storageMovement.getQuantity(), DELTA); + Assert.assertEquals(location1.getId(), storageMovement.getOriginLocation().getId()); + + } + +} Modified: trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/RequestedArticleServiceTest.java =================================================================== --- trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/RequestedArticleServiceTest.java 2013-04-25 11:08:52 UTC (rev 131) +++ trunk/magalie-services/src/test/java/com/franciaflex/magalie/services/service/RequestedArticleServiceTest.java 2013-04-25 12:57:51 UTC (rev 132) @@ -28,7 +28,8 @@ import com.franciaflex.magalie.persistence.entity.RequestedArticle; import com.franciaflex.magalie.services.AbstractMagalieServiceTest; import com.google.common.base.Preconditions; -import com.google.common.collect.Lists; +import com.google.common.collect.Iterables; +import com.google.common.collect.Sets; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.junit.Assert; @@ -37,9 +38,8 @@ import java.text.ParseException; import java.util.Date; -import java.util.LinkedList; import java.util.List; -import java.util.Queue; +import java.util.Set; public class RequestedArticleServiceTest extends AbstractMagalieServiceTest { @@ -83,26 +83,26 @@ List<RequestedArticle> requestedArticles = fixture("requestedArticles"); - Queue<RequestedArticle> requestedArticlesByPriority = + Set<RequestedArticle> requestedArticlesByPriority = service.getRequestedArticlesByPriority(requestedArticles, magalieUser); Assert.assertEquals(requestedArticles.size(), requestedArticlesByPriority.size()); - Assert.assertEquals("requestedArticle5", requestedArticlesByPriority.poll().getId()); - Assert.assertEquals("requestedArticle6", requestedArticlesByPriority.poll().getId()); - Assert.assertEquals("requestedArticle1", requestedArticlesByPriority.poll().getId()); - Assert.assertEquals("requestedArticle2", requestedArticlesByPriority.poll().getId()); - Assert.assertEquals("requestedArticle3", requestedArticlesByPriority.poll().getId()); - Assert.assertEquals("requestedArticle4", requestedArticlesByPriority.poll().getId()); + Assert.assertEquals("requestedArticle5", Iterables.get(requestedArticlesByPriority, 0).getId()); + Assert.assertEquals("requestedArticle6", Iterables.get(requestedArticlesByPriority, 1).getId()); + Assert.assertEquals("requestedArticle1", Iterables.get(requestedArticlesByPriority, 2).getId()); + Assert.assertEquals("requestedArticle2", Iterables.get(requestedArticlesByPriority, 3).getId()); + Assert.assertEquals("requestedArticle3", Iterables.get(requestedArticlesByPriority, 4).getId()); + Assert.assertEquals("requestedArticle4", Iterables.get(requestedArticlesByPriority, 5).getId()); } @Test public void testFindOrderWhenNoRequestedArticles() { - Queue<RequestedArticle> emptyQueue = Lists.newLinkedList(); + Set<RequestedArticle> emptySet = Sets.newHashSet(); - FindOrderToExecuteResult orderToExecute = service.findOrderToExecute(emptyQueue, magalieUser, building); + FindOrderToExecuteResult orderToExecute = service.findOrderToExecute(emptySet, magalieUser, building); Assert.assertTrue(orderToExecute.isNothingToDo()); Assert.assertFalse(orderToExecute.isEverythingUnavailable()); @@ -131,13 +131,12 @@ RequestedArticle requestedArticle4 = fixture("requestedArticle4"); - LinkedList<RequestedArticle> fakePriorityQueue = - Lists.newLinkedList(); + Set<RequestedArticle> fakePrioritySet = Sets.newHashSet(); - fakePriorityQueue.add(requestedArticle4); + fakePrioritySet.add(requestedArticle4); FindOrderToExecuteResult orderToExecute = - service.findOrderToExecute(fakePriorityQueue, magalieUser, building); + service.findOrderToExecute(fakePrioritySet, magalieUser, building); Assert.assertFalse(orderToExecute.isNothingToDo()); Assert.assertTrue(orderToExecute.isEverythingUnavailable()); @@ -156,13 +155,12 @@ RequestedArticle requestedArticle1 = fixture("requestedArticle1"); - LinkedList<RequestedArticle> fakePriorityQueue = - Lists.newLinkedList(); + Set<RequestedArticle> fakePrioritySet = Sets.newHashSet(); - fakePriorityQueue.add(requestedArticle1); + fakePrioritySet.add(requestedArticle1); FindOrderToExecuteResult orderToExecute = - service.findOrderToExecute(fakePriorityQueue, magalieUser, building); + service.findOrderToExecute(fakePrioritySet, magalieUser, building); Assert.assertFalse(orderToExecute.isNothingToDo()); Assert.assertTrue(orderToExecute.isEverythingUnavailable());