OSDN Git Service

ActionPerformedイベント実装
authorhizumiaoba <56146205+hizumiaoba@users.noreply.github.com>
Sat, 26 Mar 2022 15:28:28 +0000 (00:28 +0900)
committerhizumiaoba <56146205+hizumiaoba@users.noreply.github.com>
Sat, 26 Mar 2022 15:28:28 +0000 (00:28 +0900)
Crash-Report/2022-03-19-18-43-17.txt [new file with mode: 0644]
Crash-Report/2022-03-20-02-37-14.txt [new file with mode: 0644]
src/com/ranfa/lib/calc/FanCalc.java
src/com/ranfa/lib/concurrent/CountedThreadFactory.java
src/com/ranfa/main/DelesteRandomSelector.java
src/test/CrashReportTest.java
src/test/FanCalcTest.java [new file with mode: 0644]

diff --git a/Crash-Report/2022-03-19-18-43-17.txt b/Crash-Report/2022-03-19-18-43-17.txt
new file mode 100644 (file)
index 0000000..1b11dc8
--- /dev/null
@@ -0,0 +1,52 @@
+---- DelesteRandomSelector Crash Report ----
+// This software was developed by @hizumiaoba
+
+
+Time: 22/03/19 18:43
+Description: Unexpected Error
+
+
+These are simplified stack trace. (shown up to 5 lines. Full Stack trace is below.)
+java.lang.IllegalStateException: java.util.concurrent.CompletionException: java.lang.NullPointerException
+       at com.ranfa.main.DelesteRandomSelector.lambda$37(DelesteRandomSelector.java:679)
+       at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:859)
+       at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:837)
+       at java.base/java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:478)
+       at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
+
+
+A detailed walkthrough of the error, its code path and all known details is as follows:
+---------------------------------------------------------------------------------------
+
+
+Stacktrace:
+       at com.ranfa.main.DelesteRandomSelector.lambda$37(DelesteRandomSelector.java:679)
+       at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:859)
+       at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:837)
+       at java.base/java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:478)
+       at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
+       at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
+       at java.base/java.lang.Thread.run(Thread.java:829)
+Caused by: java.util.concurrent.CompletionException: java.lang.NullPointerException
+       at java.base/java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:314)
+       at java.base/java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:319)
+       at java.base/java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1739)
+       at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
+       at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
+       at java.base/java.lang.Thread.run(Thread.java:829)
+Caused by: java.lang.NullPointerException
+       at com.ranfa.main.DelesteRandomSelector.lambda$36(DelesteRandomSelector.java:638)
+       at java.base/java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1736)
+       at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
+       at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
+       at java.base/java.lang.Thread.run(Thread.java:829)
+
+
+-- System Details --
+Details:
+       DelesteRandomSelector Version: v4.0.2-Beta
+       Operating System: Windows 10 (amd64) version 10.0
+       Java Version: 11, Eclipse Adoptium
+       Java VM Version: OpenJDK 64-Bit Server VM, version 11.0.13+8
+       Memory: 55947104 bytes / 268435456 bytes up to 4273995776 bytes
+       JVM Flags: 1 total: [-Dfile.encoding=UTF-8]
diff --git a/Crash-Report/2022-03-20-02-37-14.txt b/Crash-Report/2022-03-20-02-37-14.txt
new file mode 100644 (file)
index 0000000..d822e02
--- /dev/null
@@ -0,0 +1,52 @@
+---- DelesteRandomSelector Crash Report ----
+// I may be so bad to code?
+
+
+Time: 22/03/20 02:37
+Description: Unexpected Error
+
+
+These are simplified stack trace. (shown up to 5 lines. Full Stack trace is below.)
+java.lang.IllegalStateException: java.util.concurrent.CompletionException: java.lang.NullPointerException
+       at com.ranfa.main.DelesteRandomSelector.lambda$37(DelesteRandomSelector.java:675)
+       at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:859)
+       at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:837)
+       at java.base/java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:478)
+       at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
+
+
+A detailed walkthrough of the error, its code path and all known details is as follows:
+---------------------------------------------------------------------------------------
+
+
+Stacktrace:
+       at com.ranfa.main.DelesteRandomSelector.lambda$37(DelesteRandomSelector.java:675)
+       at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:859)
+       at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:837)
+       at java.base/java.util.concurrent.CompletableFuture$Completion.run(CompletableFuture.java:478)
+       at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
+       at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
+       at java.base/java.lang.Thread.run(Thread.java:829)
+Caused by: java.util.concurrent.CompletionException: java.lang.NullPointerException
+       at java.base/java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:314)
+       at java.base/java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:319)
+       at java.base/java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1739)
+       at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
+       at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
+       at java.base/java.lang.Thread.run(Thread.java:829)
+Caused by: java.lang.NullPointerException
+       at com.ranfa.main.DelesteRandomSelector.lambda$36(DelesteRandomSelector.java:634)
+       at java.base/java.util.concurrent.CompletableFuture$AsyncRun.run(CompletableFuture.java:1736)
+       at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
+       at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
+       at java.base/java.lang.Thread.run(Thread.java:829)
+
+
+-- System Details --
+Details:
+       DelesteRandomSelector Version: v4.0.2-Beta
+       Operating System: Windows 10 (amd64) version 10.0
+       Java Version: 11, Eclipse Adoptium
+       Java VM Version: OpenJDK 64-Bit Server VM, version 11.0.13+8
+       Memory: 54553584 bytes / 268435456 bytes up to 4273995776 bytes
+       JVM Flags: 1 total: [-Dfile.encoding=UTF-8]
index 325ebe8..9ea5411 100644 (file)
@@ -22,7 +22,7 @@ import com.ranfa.lib.concurrent.CountedThreadFactory;
 public class FanCalc {
        
        private static final Logger logger = LoggerFactory.getLogger(FanCalc.class);
-       private static final ExecutorService async = Executors.newSingleThreadExecutor(new CountedThreadFactory(() -> "DRS", "FanCalcThread", false));
+       private static final ExecutorService async = Executors.newCachedThreadPool(new CountedThreadFactory(() -> "DRS", "FanCalcThread", false));
        
        /**
         * 計算式は
@@ -55,6 +55,10 @@ public class FanCalc {
        return (resPremiumed.compareTo(BigDecimal.ZERO) == 0) || (resPremiumed == null) ? 0 : Integer.parseInt(resPremiumed.toString());
     }
        
+       public static CompletableFuture<Integer> fanAsync(int score, int room, int center, int produce, int premium) {
+               return CompletableFuture.supplyAsync(() -> fan(score, room, center, produce, premium), async);
+       }
+       
        /**
         * 目標スコアを計算。
         * 初期実装の思想は並列処理による再帰計算。
@@ -90,6 +94,7 @@ public class FanCalc {
                     flag.set(true);
                 }
             }
+                       logger.info("Finished calculating. Estimated Fan value : {}", result.intValue());
                return Integer.parseInt(result.toString());
        }
        
index a4d8da7..170b677 100644 (file)
@@ -9,6 +9,7 @@ import lombok.NonNull;
 public class CountedThreadFactory implements ThreadFactory {
 
        private final Supplier<String> identifier;
+       private String specifier;
        private final AtomicLong count = new AtomicLong(1);
        private final boolean isDaemon;
        
@@ -21,13 +22,14 @@ public class CountedThreadFactory implements ThreadFactory {
        }
        
        public CountedThreadFactory(Supplier<String> identifier, String specifier, boolean isDaemon) {
-               this.identifier = () -> identifier.get() + " " + specifier;
+               this.identifier = identifier;
+               this.specifier = specifier;
                this.isDaemon = isDaemon;
        }
        
        @Override
        public Thread newThread(@NonNull Runnable r) {
-               final Thread thread = new Thread(r, identifier.get() + "-Worker " + count.getAndIncrement());
+               final Thread thread = new Thread(r, identifier.get() + " " + specifier + "-Worker " + count.getAndIncrement());
                thread.setDaemon(isDaemon);
                return thread;
        }
index 39b867f..4be80c0 100644 (file)
@@ -55,6 +55,7 @@ import com.ranfa.lib.Settings;
 import com.ranfa.lib.Suffix;
 import com.ranfa.lib.TwitterIntegration;
 import com.ranfa.lib.Version;
+import com.ranfa.lib.calc.FanCalc;
 import com.ranfa.lib.concurrent.CountedThreadFactory;
 import com.ranfa.lib.database.EstimateAlbumTypeCycle;
 import com.ranfa.lib.database.Scraping;
@@ -167,8 +168,8 @@ public class DelesteRandomSelector extends JFrame {
        private JLabel labelScoreVersion;
        private JLabel labelScoreUserPlayed;
        private JTextField fieldScoreUserPlayed;
-       private JLabel labelScoreEstimatedFan;
-       private JTextField fieldScoreEstimatedFan;
+       private JLabel labelScoreEarnedFan;
+       private JTextField fieldScoreEarnedFan;
        private JLabel lblSongname;
        private JLabel labelScoreAttribute;
        private JLabel labelScoreDifficulty;
@@ -184,6 +185,22 @@ public class DelesteRandomSelector extends JFrame {
        private JLabel labelScoreCurrentSongOrder;
        private JLabel labelScoreSlash;
        private JLabel labelScoreOrderMax;
+       private JLabel labelPlayerScore;
+       private JLabel labelPlayerFan;
+       private JLabel labelPlayerPRP;
+       private JLabel labelPlayerScoreDynamic;
+       private JLabel labelPlayerFanDynamic;
+       private JLabel labelPlayerPRPDynamic;
+       private JTextField fieldScoreRoom;
+       private JTextField fieldScoreCenter;
+       private JTextField fieldScoreProduce;
+       private JTextField fieldScorePremium;
+       private JLabel label;
+       private JLabel lblRoom;
+       private JLabel lblCenter;
+       private JLabel lblProduce;
+       private JLabel lblPremium;
+       private JButton button;
 
     /**
      * Launch the application.
@@ -201,11 +218,6 @@ public class DelesteRandomSelector extends JFrame {
     }
 
     /**
-     * log file prefix:
-     *  this.getClass() + ":[LEVEL]: " +
-     */
-
-    /**
      * Create the frame.
      */
     public DelesteRandomSelector() {
@@ -620,10 +632,10 @@ public class DelesteRandomSelector extends JFrame {
                        String currentTabName = tabbedPane.getTitleAt(tabbedPane.getSelectedIndex());
                        if(currentTabName.equals("SongInfo") && labelCurrentSongOrderTool.getText().equals("null")) {
                                logger.info("Detected switching tool tab");
-                               listToolMapData = listToolMapDataFuture.join();
                                if(toolIntegrateList == null) {
                                        return;
                                }
+                               listToolMapData = listToolMapDataFuture.join();
                                Song firstSong = toolIntegrateList.get(0);
                                Map<String, String> fetchMap = new HashMap<>();
                                for(Map<String, String> tmpMap : listToolMapData) {
@@ -998,7 +1010,7 @@ public class DelesteRandomSelector extends JFrame {
                        FormSpecs.RELATED_GAP_COLSPEC,
                        ColumnSpec.decode("max(60dlu;default)"),
                        FormSpecs.RELATED_GAP_COLSPEC,
-                       ColumnSpec.decode("max(60dlu;default)"),
+                       ColumnSpec.decode("max(60dlu;default):grow"),
                        FormSpecs.RELATED_GAP_COLSPEC,
                        ColumnSpec.decode("max(68dlu;default)"),
                        FormSpecs.RELATED_GAP_COLSPEC,
@@ -1029,6 +1041,10 @@ public class DelesteRandomSelector extends JFrame {
                        FormSpecs.RELATED_GAP_ROWSPEC,
                        FormSpecs.DEFAULT_ROWSPEC,
                        FormSpecs.RELATED_GAP_ROWSPEC,
+                       RowSpec.decode("max(13dlu;default)"),
+                       FormSpecs.RELATED_GAP_ROWSPEC,
+                       FormSpecs.DEFAULT_ROWSPEC,
+                       FormSpecs.RELATED_GAP_ROWSPEC,
                        FormSpecs.DEFAULT_ROWSPEC,
                        FormSpecs.RELATED_GAP_ROWSPEC,
                        FormSpecs.DEFAULT_ROWSPEC,
@@ -1052,57 +1068,91 @@ public class DelesteRandomSelector extends JFrame {
                        RowSpec.decode("default:grow"),}));
        
        labelScoreUserPlayed = new JLabel("Your score");
-       panelScoreCenter.add(labelScoreUserPlayed, "2, 10, center, default");
-       
-       labelScoreEstimatedFan = new JLabel("Estimated Fan");
-       panelScoreCenter.add(labelScoreEstimatedFan, "6, 10, center, default");
+       panelScoreCenter.add(labelScoreUserPlayed, "4, 10, center, default");
        
        fieldScoreUserPlayed = new JTextField();
-       panelScoreCenter.add(fieldScoreUserPlayed, "2, 12, fill, default");
+       panelScoreCenter.add(fieldScoreUserPlayed, "6, 10, fill, default");
        fieldScoreUserPlayed.setColumns(10);
        
-       fieldScoreEstimatedFan = new JTextField();
-       panelScoreCenter.add(fieldScoreEstimatedFan, "6, 12, center, default");
-       fieldScoreEstimatedFan.setColumns(10);
-       
        lblSongname = new JLabel("Songname");
-       panelScoreCenter.add(lblSongname, "10, 12, center, default");
+       panelScoreCenter.add(lblSongname, "10, 10, center, default");
        
        labelScoreSongnameDynamic = new JLabel("<dynamic>");
-       panelScoreCenter.add(labelScoreSongnameDynamic, "12, 12, center, default");
+       panelScoreCenter.add(labelScoreSongnameDynamic, "12, 10, center, default");
+       
+       labelScoreEarnedFan = new JLabel("Earned Fan");
+       panelScoreCenter.add(labelScoreEarnedFan, "4, 14, center, default");
+       
+       fieldScoreEarnedFan = new JTextField();
+       panelScoreCenter.add(fieldScoreEarnedFan, "6, 14, fill, default");
+       fieldScoreEarnedFan.setColumns(10);
        
        labelScoreAttribute = new JLabel("Attribute");
-       panelScoreCenter.add(labelScoreAttribute, "10, 16, center, default");
+       panelScoreCenter.add(labelScoreAttribute, "10, 14, center, default");
        
        labelScoreAttributeDynamic = new JLabel("<dynamic>");
-       panelScoreCenter.add(labelScoreAttributeDynamic, "12, 16");
+       panelScoreCenter.add(labelScoreAttributeDynamic, "12, 14");
+       
+       lblRoom = new JLabel("room");
+       panelScoreCenter.add(lblRoom, "4, 18, center, default");
+       
+       fieldScoreRoom = new JTextField();
+       panelScoreCenter.add(fieldScoreRoom, "6, 18, fill, default");
+       fieldScoreRoom.setColumns(10);
        
        labelScoreDifficulty = new JLabel("Difficulty");
-       panelScoreCenter.add(labelScoreDifficulty, "10, 20, center, default");
+       panelScoreCenter.add(labelScoreDifficulty, "10, 18, center, default");
        
        labelScoreDifficultyDynamic = new JLabel("<dynamic>");
-       panelScoreCenter.add(labelScoreDifficultyDynamic, "12, 20");
+       panelScoreCenter.add(labelScoreDifficultyDynamic, "12, 18");
+       
+       lblCenter = new JLabel("center");
+       panelScoreCenter.add(lblCenter, "4, 22, center, default");
+       
+       fieldScoreCenter = new JTextField();
+       panelScoreCenter.add(fieldScoreCenter, "6, 22, fill, default");
+       fieldScoreCenter.setColumns(10);
        
        labelScoreLevel = new JLabel("Level");
-       panelScoreCenter.add(labelScoreLevel, "10, 24, center, default");
+       panelScoreCenter.add(labelScoreLevel, "10, 22, center, default");
        
        labelScoreLevelDynamic = new JLabel("<dynamic>");
-       panelScoreCenter.add(labelScoreLevelDynamic, "12, 24");
+       panelScoreCenter.add(labelScoreLevelDynamic, "12, 22");
+       
+       lblProduce = new JLabel("produce");
+       panelScoreCenter.add(lblProduce, "4, 26, center, default");
+       
+       fieldScoreProduce = new JTextField();
+       panelScoreCenter.add(fieldScoreProduce, "6, 26, fill, default");
+       fieldScoreProduce.setColumns(10);
        
        labelScoreNotes = new JLabel("Notes");
-       panelScoreCenter.add(labelScoreNotes, "10, 28, center, default");
+       panelScoreCenter.add(labelScoreNotes, "10, 26, center, default");
        
        labelScoreNotesDynamic = new JLabel("<dynamic>");
-       panelScoreCenter.add(labelScoreNotesDynamic, "12, 28");
+       panelScoreCenter.add(labelScoreNotesDynamic, "12, 26");
+       
+       lblPremium = new JLabel("premium");
+       panelScoreCenter.add(lblPremium, "4, 30, center, default");
+       
+       fieldScorePremium = new JTextField();
+       panelScoreCenter.add(fieldScorePremium, "6, 30, fill, default");
+       fieldScorePremium.setColumns(10);
+       
+       labelPlayerScore = new JLabel("Estimated Score");
+       panelScoreCenter.add(labelPlayerScore, "10, 30, center, default");
+       
+       labelPlayerScoreDynamic = new JLabel("<dynamic>");
+       panelScoreCenter.add(labelPlayerScoreDynamic, "12, 30");
        
        labelScoreCurrentSongOrder = new JLabel("null");
-       panelScoreCenter.add(labelScoreCurrentSongOrder, "14, 28, center, default");
+       panelScoreCenter.add(labelScoreCurrentSongOrder, "14, 30, center, default");
        
        labelScoreSlash = new JLabel("/");
-       panelScoreCenter.add(labelScoreSlash, "16, 28, center, default");
+       panelScoreCenter.add(labelScoreSlash, "16, 30, center, default");
        
        labelScoreOrderMax = new JLabel(String.valueOf(property.getSongLimit()));
-       panelScoreCenter.add(labelScoreOrderMax, "18, 28, center, default");
+       panelScoreCenter.add(labelScoreOrderMax, "18, 30, center, default");
        
        btnScorePrev = new JButton("Prev");
        btnScorePrev.addActionListener(new ActionListener() {
@@ -1124,7 +1174,7 @@ public class DelesteRandomSelector extends JFrame {
                        }, es);
                }
        });
-       panelScoreCenter.add(btnScorePrev, "14, 30");
+       panelScoreCenter.add(btnScorePrev, "14, 32");
        
        btnScoreNext = new JButton("Next");
        btnScoreNext.addActionListener(new ActionListener() {
@@ -1146,7 +1196,69 @@ public class DelesteRandomSelector extends JFrame {
                        }, es);
                }
        });
-       panelScoreCenter.add(btnScoreNext, "18, 30");
+       panelScoreCenter.add(btnScoreNext, "18, 32");
+       
+       labelPlayerFan = new JLabel("Estimated Fan");
+       panelScoreCenter.add(labelPlayerFan, "10, 34, center, default");
+       
+       labelPlayerFanDynamic = new JLabel("<dynamic>");
+       panelScoreCenter.add(labelPlayerFanDynamic, "12, 34");
+       
+       button = new JButton("自動計算");
+       button.addActionListener(new ActionListener() {
+               @Override
+               public void actionPerformed(ActionEvent e) {
+                       CompletableFuture.runAsync(() -> {
+                               String scoreStr = fieldScoreUserPlayed.getText();
+                               String fanStr = fieldScoreEarnedFan.getText();
+                               if(scoreStr.isEmpty() && fanStr.isEmpty()) {
+                                       logger.warn("there is no data to calculate.");
+                                       JOptionPane.showMessageDialog(null, "計算できるデータが存在しません。スコアかファン数のどちらかは必ず入力してください。");
+                                       return;
+                               }
+                               labelPlayerScoreDynamic.setText("Calculating...");
+                               labelPlayerFanDynamic.setText("Calculating...");
+                               String roomStr = fieldScoreRoom.getText();
+                               String centerStr = fieldScoreCenter.getText();
+                               String produceStr = fieldScoreProduce.getText();
+                               String premiumStr = fieldScorePremium.getText();
+                               if(!scoreStr.isEmpty()) {
+                                       int score = Integer.parseInt(scoreStr);
+                                       int room = roomStr.isEmpty() ? 100 : Integer.parseInt(roomStr);
+                                       int center = centerStr.isEmpty() ? 100 : Integer.parseInt(centerStr);
+                                       int produce = produceStr.isEmpty() ? 100 : Integer.parseInt(produceStr);
+                                       int premium = premiumStr.isEmpty() ? 100 : Integer.parseInt(premiumStr);
+                                       int res = FanCalc.fanAsync(score, room, center, produce, premium).join();
+                                       labelPlayerScoreDynamic.setText(String.valueOf(res));
+                                       labelPlayerFanDynamic.setText(scoreStr);
+                               } else {
+                                       int fan = Integer.parseInt(fanStr);
+                                       int room = roomStr.isEmpty() ? 100 : Integer.parseInt(fanStr);
+                                       int center = centerStr.isEmpty() ? 100 : Integer.parseInt(centerStr);
+                                       int produce = produceStr.isEmpty() ? 100 : Integer.parseInt(produceStr);
+                                       int premium = premiumStr.isEmpty() ? 100 : Integer.parseInt(premiumStr);
+                                       int res = FanCalc.scoreAsync(fan, 1, room, center, produce, premium).join();
+                                       labelPlayerFanDynamic.setText(String.valueOf(res));
+                                       labelPlayerScoreDynamic.setText(scoreStr);
+                               }
+                       }, es).whenComplete((ret, ex) -> {
+                               if(ex != null) {
+                                       logger.error("Exception was thrown during concurrent process.", ex);
+                                       JOptionPane.showMessageDialog(null, "イベント処理中に例外が発生しました。" + ex.getLocalizedMessage());
+                               }
+                       });
+               }
+       });
+       panelScoreCenter.add(button, "18, 36");
+       
+       labelPlayerPRP = new JLabel("Estimated PRP");
+       panelScoreCenter.add(labelPlayerPRP, "10, 38, center, default");
+       
+       labelPlayerPRPDynamic = new JLabel("<dynamic>");
+       panelScoreCenter.add(labelPlayerPRPDynamic, "12, 38");
+       
+       label = new JLabel("<html><body>デレステに表示されている百分率をそのまま入力してください</body></html>");
+       panelScoreCenter.add(label, "6, 40");
        if(isFirst || !this.property.isCheckLibraryUpdates()) {
            setEnabled.run();
        }
index ced1d50..223877a 100644 (file)
@@ -9,7 +9,6 @@ import java.nio.file.Paths;
 import java.util.Arrays;
 import java.util.List;
 
-import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -41,18 +40,5 @@ public class CrashReportTest {
                assertEquals(Integer.MIN_VALUE, handle.getEstimateExitCode());
                assertEquals(handle.getThrowable().getClass(), RuntimeException.class);
        }
-       
-       @AfterClass
-       public static void deleteReport() throws IOException {
-               List<Path> after = Arrays.asList(Files.list(Paths.get(INPUT_DIR)).toArray(Path[]::new));
-               after.removeAll(before);
-               after.stream().forEach(t -> {
-                       try {
-                               Files.delete(t);
-                       } catch (IOException e) {
-                               e.printStackTrace();
-                       }
-               });
-       }
 
 }
diff --git a/src/test/FanCalcTest.java b/src/test/FanCalcTest.java
new file mode 100644 (file)
index 0000000..ea83d65
--- /dev/null
@@ -0,0 +1,25 @@
+package test;
+
+import static org.junit.Assert.*;
+
+import org.junit.Test;
+
+import com.ranfa.lib.calc.FanCalc;
+
+public class FanCalcTest {
+       
+       @Test
+       public void scoreToFanTest() {
+               final int score = 1000000;
+               // 端数切り上げ(スコア*0.001*ルーム補正値*センター、ゲスト効果補正値*プロデュース方針補正値)
+               int actual = FanCalc.fan(score, 100, 100, 100, 100);
+               assertEquals(1000, actual);
+       }
+       
+       @Test
+       public void fanToScoreTest() {
+               int score = FanCalc.scoreAsync(11, 1, 100, 100, 100, 100).join();
+               assertEquals(5000, score);
+       }
+
+}