File Coverage

blib/lib/App/Test/DWG/LibreDWG/JSON.pm
Criterion Covered Total %
statement 46 90 51.1
branch 1 22 4.5
condition 2 12 16.6
subroutine 13 15 86.6
pod 2 2 100.0
total 64 141 45.3


line stmt bran cond sub pod time code
1             package App::Test::DWG::LibreDWG::JSON;
2              
3 4     4   74836 use strict;
  4         27  
  4         115  
4 4     4   22 use warnings;
  4         8  
  4         117  
5              
6 4     4   2012 use CAD::AutoCAD::Detect qw(detect_dwg_file);
  4         129433  
  4         72  
7 4     4   2470 use Capture::Tiny qw(capture);
  4         109456  
  4         255  
8 4     4   2100 use File::Copy;
  4         9618  
  4         247  
9 4     4   25 use File::Path qw(mkpath);
  4         9  
  4         226  
10 4     4   1902 use File::Spec::Functions qw(catfile);
  4         3699  
  4         249  
11 4     4   29 use File::Temp qw(tempdir);
  4         27  
  4         193  
12 4     4   8161 use Getopt::Std;
  4         198  
  4         248  
13 4     4   1984 use IO::Barf qw(barf);
  4         2534  
  4         82  
14 4     4   256 use Readonly;
  4         9  
  4         3460  
15              
16             Readonly::Hash our %REL => (
17             'MC0.0' => 'r1.1',
18             'AC1.2' => 'r1.2',
19             'AC1.40' => 'r1.4',
20             'AC1.50' => 'r2.0',
21             'AC2.10' => 'r2.10',
22             'AC1001' => 'r2.4',
23             'AC1002' => 'r2.5',
24             'AC1003' => 'r2.6',
25             'AC1004' => 'r9',
26             'AC1006' => 'r10',
27             'AC1009' => 'r11',
28             'AC1012' => 'r13',
29             'AC1013' => 'r13c3',
30             'AC1014' => 'r14',
31             'AC1015' => 'r2000',
32             'AC1018' => 'r2004',
33             'AC1021' => 'r2007',
34             'AC1024' => 'r2010',
35             'AC1027' => 'r2013',
36             'AC1032' => 'r2018',
37             );
38             Readonly::Scalar our $DR => 'dwgread';
39             Readonly::Scalar our $DW => 'dwgwrite';
40              
41             our $VERSION = 0.03;
42              
43             # Constructor.
44             sub new {
45 2     2 1 1633 my ($class, @params) = @_;
46              
47             # Create object.
48 2         9 my $self = bless {}, $class;
49              
50             # Object.
51 2         8 return $self;
52             }
53              
54             # Run.
55             sub run {
56 1     1 1 3 my $self = shift;
57              
58             # Process arguments.
59 1         8 $self->{'_opts'} = {
60             'd' => undef,
61             'h' => 0,
62             'v' => 0,
63             };
64 1 50 33     5 if (! getopts('d:hv:', $self->{'_opts'}) || @ARGV < 1
      33        
65             || $self->{'_opts'}->{'h'}) {
66              
67 1         114 print STDERR "Usage: $0 [-d test_dir] [-h] [-v level] [--version] dwg_file\n";
68 1         19 print STDERR "\t-d test_dir\tTest directory (default is directory in system tmp).\n";
69 1         12 print STDERR "\t-h\t\tPrint help.\n";
70 1         11 print STDERR "\t-v level\tVerbosity level (default 0, max 9).\n";
71 1         12 print STDERR "\t--version\tPrint version.\n";
72 1         11 print STDERR "\tdwg_file\tAutoCAD DWG file to test.\n";
73 1         5 return 1;
74             }
75 0           $self->{'_dwg_file'} = shift @ARGV;
76              
77 0           my $tmp_dir = $self->{'_opts'}->{'d'};
78 0 0 0       if (defined $tmp_dir && ! -d $tmp_dir) {
79 0           mkpath($tmp_dir);
80             }
81 0 0 0       if (! defined $tmp_dir || ! -d $tmp_dir) {
82 0           $tmp_dir = tempdir(CLEANUP => 1);
83             }
84 0           $self->{'_tmp_dir'} = $tmp_dir;
85              
86             # Copy original file to dir.
87 0           my $dwg_file_first = catfile($tmp_dir, 'first.dwg');
88 0           copy($self->{'_dwg_file'}, $dwg_file_first);
89              
90             # Get magic string.
91 0           my $magic = detect_dwg_file($dwg_file_first);
92 0 0         if (! exists $REL{$magic}) {
93 0           print STDERR "dwgwrite for magic '$magic' doesn't supported.\n";
94 0           return 1;
95             }
96 0           my $dwgwrite_version = $REL{$magic};
97              
98             # Verbose level.
99 0           my $v = '-v'.$self->{'_opts'}->{'v'};
100              
101             # Convert dwg file to JSON.
102 0           my $json_file_first = catfile($tmp_dir, 'first.json');
103 0           my $dwg_to_json_first = "$DR $v -o $json_file_first $dwg_file_first";
104 0 0         if ($self->_exec($dwg_to_json_first, 'dwg_to_json')) {
105 0           return 1;
106             }
107              
108             # Convert JSON to dwg file.
109 0           my $dwg_file_second = catfile($tmp_dir, 'second.dwg');
110 0           my $json_to_dwg_first = "$DW --as $dwgwrite_version $v -o $dwg_file_second $json_file_first";
111 0 0         if ($self->_exec($json_to_dwg_first, 'json_to_dwg')) {
112 0           return 1;
113             }
114              
115             # Convert new dwg file to JSON.
116 0           my $json_file_second = catfile($tmp_dir, 'second.json');
117 0           my $dwg_to_json_second = "$DR $v -o $json_file_second $dwg_file_second";
118 0 0         if ($self->_exec($dwg_to_json_second, 'dwg_to_json_second')) {
119 0           return 1;
120             }
121              
122             # Compare JSON files.
123 0           my $diff = "diff $json_file_first $json_file_second";
124 0           system($diff);
125              
126 0           return 0;
127             }
128              
129             sub _exec {
130 0     0     my ($self, $command, $log_prefix) = @_;
131              
132             my ($stdout, $stderr, $exit_code) = capture {
133 0     0     system($command);
134 0           };
135              
136 0 0         if (defined $log_prefix) {
137 0 0         if ($stdout) {
138 0           my $stdout_file = catfile($self->{'_tmp_dir'},
139             $log_prefix.'-stdout.log');
140 0           barf($stdout_file, $stdout);
141             }
142 0 0         if ($stderr) {
143 0           my $stderr_file = catfile($self->{'_tmp_dir'},
144             $log_prefix.'-stderr.log');
145 0           barf($stderr_file, $stderr);
146             }
147             }
148              
149 0 0         if ($exit_code) {
150 0           print STDERR "Command '$command' exit with $exit_code.\n";
151 0           return 1;
152             }
153              
154 0           return 0;
155             }
156              
157             1;
158              
159              
160             __END__