]> ruin.nu Git - ndwebbie.git/commitdiff
Make Planet Scan parsing testable
authorMichael Andreen <michael@andreen.dev>
Sun, 15 Jan 2023 12:28:59 +0000 (13:28 +0100)
committerMichael Andreen <michael@andreen.dev>
Sun, 15 Jan 2023 12:28:59 +0000 (13:28 +0100)
lib/NDWeb/Scans.pm
scripts/scans.pl
t/planetscan.html [new file with mode: 0644]
t/scans.t

index bb05e99408d6bbe1cb69aea55b30a29f220f4df4..cfec2fd5ce4e7eb44441d3f77427a2d223619ffa 100644 (file)
@@ -24,7 +24,7 @@ require Exporter;
 
 our @ISA = qw/Exporter/;
 
-our @EXPORT = qw/parseMilScan doMilScan/;
+our @EXPORT = qw/parseMilScan doMilScan doPlanetScan/;
 
 my %classes = (Fighter => 'Fi', Corvette => 'Co', Frigate => 'Fr', Destroyer => 'De', Cruiser => 'Cr', Battleship => 'Bs', Structure => 'St', Roids => 'Ro', Resources => 'Re', '-' => '-');
 
@@ -81,4 +81,32 @@ sub doMilScan ($$$) {
        }
 }
 
+my $addplanetscan_sql = q{INSERT INTO planet_scans
+       (id,tick,pid,metal_roids,metal,crystal_roids,crystal,eonium_roids,eonium
+               ,agents,guards,light,medium,heavy,hidden)
+       VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)};
+
+sub doPlanetScan ($$$) {
+       my ($dbh, $scan,$file) = @_;
+
+       my $addplanetscan = $dbh->prepare_cached($addplanetscan_sql);
+
+       my @values = ($scan->{id},$scan->{tick},$scan->{pid});
+       $file =~ s/(\d),(\d)/$1$2/g;
+
+       while($file =~ m{"center">(Metal|Crystal|Eonium)</td>\D+(\d+)\D+([\d,]+)}g){
+               push @values,$2,$3;
+       }
+       if($file =~ m{Security\ Guards .+? "center">(\d+)</td>
+                       .+? "center">(\d+)</td>}sx){
+               push @values,$1,$2;
+       }
+       if($file =~ m{<td class="center">([A-Z][a-z]+)</td><td class="center">([A-Z][a-z]+)</td><td class="center">([A-Z][a-z]+)</td>}){
+               push @values,$1,$2,$3;
+       }
+       if($file =~ m{<span class="superhighlight">([\d,]+)</span>}){
+               push @values,$1;
+       }
+       $addplanetscan->execute(@values);
+}
 
index 525c969c9d42c8876200491b1813909415900438..200e33f4e8a8d4c59f32b378b505322cf0af962b 100755 (executable)
@@ -85,31 +85,11 @@ my $addintel = $dbh->prepare(q{INSERT INTO intel (name,mission,sender,target,tic
        VALUES(?,?,?,?,?,?,?,?,?,-1) RETURNING id});
 my $intelscan = $dbh->prepare(q{INSERT INTO intel_scans (intel,id) VALUES(?,?)});
 my $addships = $dbh->prepare(q{INSERT INTO fleet_ships (fid,ship,amount) VALUES(?,?,?)});
-my $addplanetscan = $dbh->prepare(q{INSERT INTO planet_scans
-       (id,tick,pid,metal_roids,metal,crystal_roids,crystal,eonium_roids,eonium
-               ,agents,guards,light,medium,heavy,hidden)
-       VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)});
 
 sub parse_planet {
        my ($scan,$file) = @_;
 
-       my @values = ($scan->{id},$scan->{tick},$scan->{pid});
-       $file =~ s/(\d),(\d)/$1$2/g;
-
-       while($file =~ m{"center">(Metal|Crystal|Eonium)</td>\D+(\d+)\D+([\d,]+)}g){
-               push @values,$2,$3;
-       }
-       if($file =~ m{Security\ Guards .+? "center">(\d+)</td>
-                       .+? "center">(\d+)</td>}sx){
-               push @values,$1,$2;
-       }
-       if($file =~ m{<td class="center">([A-Z][a-z]+)</td><td class="center">([A-Z][a-z]+)</td><td class="center">([A-Z][a-z]+)</td>}){
-               push @values,$1,$2,$3;
-       }
-       if($file =~ m{<span class="superhighlight">([\d,]+)</span>}){
-               push @values,$1;
-       }
-       $addplanetscan->execute(@values);
+       doPlanetScan($dbh, $scan, $file);
 }
 
 sub parse_incoming {
diff --git a/t/planetscan.html b/t/planetscan.html
new file mode 100644 (file)
index 0000000..396fa2f
--- /dev/null
@@ -0,0 +1,97 @@
+<!DOCTYPE html>
+<html>
+       <head>
+               <meta charset="iso-8859-1">
+               <title>Planetarion > Scan</title>
+               <link href="images/template53/planetarion.css?rn=r100.0002" rel="stylesheet" type="text/css">
+               <link rel="stylesheet" type="text/css" href="javascript/jquery/ui-1.10.3.css">
+               <link rel="shortcut icon" type="image/ico" href="images/favicon.ico">
+               <link rel="apple-touch-icon" href="images/apple-touch-icon.png">
+               <script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" integrity="sha256-wS9gmOZBqsqWxgIVgA8Y9WcQOa7PgSIX+rPA0VL2rbQ=" crossorigin="anonymous"></script>
+               <script>window.jQuery || document.write('<script src=\"javascript/jquery/jquery-1.9.1.js\"><\/script>')</script>
+               <script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js" integrity="sha256-lnH4vnCtlKU2LmD0ZW1dU7ohTTKrcKP50WA9fa350cE=" crossorigin="anonymous"></script>
+               <script>window.jQuery.ui || document.write('<script src=\"javascript/jquery/ui-1.10.3.js\"><\/script>')</script>
+               <script src="javascript/jq_0.3.4.js"></script>
+               <script src="javascript/global.js?r94.0001"></script>
+               <script src="javascript/bcalc_0.3.5.js"></script>
+               <script>
+                       (function(i,s,o,g,r,a,m) { i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
+                       ga('create', 'UA-44044400-2', 'planetarion.com');
+                       ga('send', 'pageview');
+               </script>
+       </head>
+               <body class="linux chrome chrome108">
+                       <script>
+                       var PA = {
+                               "servertime": 1673734778000,
+                               "timediff": (1673734778000 - (new Date().getTime())),
+                               "ticking": 1,
+                               "tick_speed": 3600,
+                               "last_tick": 27,
+                               "round_start": 1673640000000,
+                               "round_end": 1677873600000,
+                               "page": "scan",
+                               "mobile": 0
+                       };
+                       </script>
+                       <div id="load_box" style="display: none;"></div>
+                       <div id="page_scan" class="pages">
+<div id="top">
+       <a href="http://www.planetarion.com" id="logo"></a>
+       <div id="tnav">
+               <ul id="tnav_links">
+                       <li class="tnav_link"><a href="manual.pl" target="_blank"  id="bar_manual"><span>Manual</span></a></li>
+                       <li class="tnav_link"><a href="support.pl" target="_blank"  id="bar_support"><span>Support</span></a></li>
+                       <li class="tnav_link"><a href="http://www.planetarion.com/" target="_blank" id="bar_portal"><span>Portal</span></a></li>
+                       <li class="tnav_link"><a href="http://pirate.planetarion.com" target="_blank" id="bar_forums"><span>Forums</span></a></li>
+                       <li class="tnav_link"><a href="logout.pl" id="bar_logout"><span>Logout</span></a></li>
+               </ul>
+       </div>
+</div>
+
+<div id="full_page">
+       <div id="contents">
+               <div id="contents_header"></div>
+<div class="container" id="scan">
+       <div class="header">Scan Result <a href="#" class="show_hide" id="scan_showhide">[Hide]</a></div>
+       <div class="maintext">
+<p class="center"><a href="showscan.pl?scan_id=aaxq2l9pspfhb88" target="scan">Scan Link</a><br>[scan]aaxq2l9pspfhb88[/scan]</p>
+<p class="right scan_time">Scan time: Sat, 14 Jan 19:32:27</p>
+<p class="center"><a href="#" onclick="set_ships_cookie(event, 'scan', 'aaxq2l9pspfhb88', 'Value: 149,656\nScore: 160,936\nMetal Roids: 100\nCrystal Roids: 130\nEonium Roids: 100\n');">Add To Bcalc</a><span class="bcalc_links" id="bcalc_link_aaxq2l9pspfhb88"></span><br><span class="bcalc_target" id="bcalc_target_aaxq2l9pspfhb88"></span></p>
+<h2 class="center header">Planet Scan on 4:4:7 in tick 24</h2>
+<table>
+       <tr><td colspan="2" class="center">Sandwich Full of Billy Roll (Ter)</td></tr>
+       <tr><th style="width: 50%;" class="center">Value</th><th style="width: 50%;" class="center">Score</th></tr>
+       <tr><td style="width: 50%;" class="center">149,656</td><td style="width: 50%;" class="center">160,936</td></tr>
+</table>
+<table>
+       <tr><th style="width: 50%;" class="center">Agents</th><th style="width: 50%;" class="center">Security Guards</th></tr>
+       <tr><td style="width: 50%;" class="center">100</td><td style="width: 50%;" class="center">805</td></tr>
+</table>
+<table>
+       <tr><th style="width: 33%;" class="center">Type</th><th style="width: 33%;" class="center">Asteroids</th><th style="width: 33%;" class="center">Resources</th></tr>
+       <tr><td class="center">Metal</td><td class="center">100</td><td class="center">78,363</td></tr>
+       <tr><td class="center">Crystal</td><td class="center">130</td><td class="center">147,874</td></tr>
+       <tr><td class="center">Eonium</td><td class="center">100</td><td class="center">169,077</td></tr>
+       <tr><th class="center" colspan="3"></th></tr>
+       <tr><th class="center" colspan="3">Factory Usage</th></tr>
+       <tr><th class="center">Light</th><th class="center">Medium</th><th class="center">Heavy</th></tr>
+       <tr><td class="center">None</td><td class="center">High</td><td class="center">None</td></tr>
+</table>
+<p class="center">Total Amount of Resources in Production: <span class="superhighlight">4,612,500</span><br>
+Total Amount of Resources From Ships Being Sold: <span class="superhighlight">0</span></p>
+<hr><br>
+       </div>
+       <div class="footer"></div>
+</div>
+<div id="side_select_box" style="display: none;">
+<p class="right"><a href="#" title="close" onclick="hide(event, 'side_select_box')">X</a>&nbsp;&nbsp;</p>
+<p class="center" id="side_select"></p>
+</div>
+               <div id="contents_footer"></div>
+       </div>
+       <div id="footer"></div>
+</div>
+                       </div>
+       </body>
+</html>
index df404dd62030f6facb7924ff1642489f3b64d8c8..37647d922552e3025830291d7cb754e942051a66 100644 (file)
--- a/t/scans.t
+++ b/t/scans.t
@@ -106,6 +106,46 @@ my $dbh = DBI->connect( 'DBI:Mock:', '', '' )
                is($exec_history->[4]->{params}->[1], 'Chimera');
                is($exec_history->[4]->{params}->[2], 54500);
        }
+
+}
+
+my $planetscan = do {
+       open my $in, '<', "$FindBin::Bin/planetscan.html" or die "Can't read file: $!";
+       local $/;
+       <$in>
+};
+
+$dbh->{mock_clear_history} = 1;
+{
+       my $scan = {id => 31337, type => 'Planet', pid => 1337, tick => 123};
+       doPlanetScan($dbh, $scan, $planetscan);
+       my $history = $dbh->{mock_all_history};
+       is(scalar(@{$history}), 1, 'Add planet scan');
+
+       my $sth = $history->[0];
+       my $exec_history = $sth->{execution_history};
+       like($sth->statement,
+               qr{\QINSERT INTO planet_scans\E\s*
+                       \(id,tick,pid,metal_roids,metal,crystal_roids,crystal,eonium_roids,eonium
+                               \s*,agents,guards,light,medium,heavy,hidden\).*}xsi,
+       );
+       is(scalar(@{$exec_history}), 1);
+       is(scalar(@{$exec_history->[0]->{params}}), 15);
+       is($exec_history->[0]->{params}->[0], $scan->{id});
+       is($exec_history->[0]->{params}->[1], $scan->{tick});
+       is($exec_history->[0]->{params}->[2], $scan->{pid});
+       is($exec_history->[0]->{params}->[3], 100);
+       is($exec_history->[0]->{params}->[4], 78363);
+       is($exec_history->[0]->{params}->[5], 130);
+       is($exec_history->[0]->{params}->[6], 147874);
+       is($exec_history->[0]->{params}->[7], 100);
+       is($exec_history->[0]->{params}->[8], 169077);
+       is($exec_history->[0]->{params}->[9], 100);
+       is($exec_history->[0]->{params}->[10], 805);
+       is($exec_history->[0]->{params}->[11], 'None');
+       is($exec_history->[0]->{params}->[12], 'High');
+       is($exec_history->[0]->{params}->[13], 'None');
+       is($exec_history->[0]->{params}->[14], '4612500');
 }
 
 done_testing();