1#!/bin/sh
2# dxf.test
3#
4# Copyright (C) 2018-2021 Free Software Foundation, Inc.
5#
6# This program is free software, licensed under the terms of the GNU
7# General Public License as published by the Free Software Foundation,
8# either version 3 of the License, or (at your option) any later version.
9# You should have received a copy of the GNU General Public License
10# along with this program.  If not, see <http://www.gnu.org/licenses/>.
11#
12# test DXF specific content
13# Author: Reini Urban
14
15[ -z "$DATADIR" ] && DATADIR="../../test/test-data"
16top_builddir=".."
17EXEEXT=""
18# artefact for "shellcheck"
19[ -z "$top_builddir" ] && echo $top_builddir
20
21i=0
22rm -f ./*dxf.log
23enable_debug="$(grep '^CFLAGS =' Makefile | grep 'DDEBUG_CLASSES')"
24is_release="$(grep -c 'IS_RELEASE 1' ../src/config.h)"
25
26check_subentity() {
27    if [ -f "$dwg" ] && [ -f "$dxf" ]; then
28        ${top_builddir}/libtool --mode=execute ./dwg2dxf${EXEEXT} -y -v4 -o "$tgt" "$dwg" 2>/dev/null
29        grep -A8 ^VERTEX "$dxf" >tmp1
30        grep -A8 ^VERTEX "$tgt" >tmp2
31        d="$(diff -bu1 tmp1 tmp2)"
32        test -z "$d" || echo "VERTEX $tgt $d"
33        grep -A8 ^SEQEND "$dxf" >tmp1
34        grep -A8 ^SEQEND "$tgt" >tmp2
35        d="$(diff -bu1 tmp1 tmp2)"
36        test -z "$d" || echo "SEQEND $tgt $d"
37        grep -A8 ^POLYLINE "$dxf" >tmp1
38        grep -A8 ^POLYLINE "$tgt" >tmp2
39        d="$(diff -bu1 tmp1 tmp2)"
40        test -z "$d" || echo "POLYLINE $tgt $d"
41        rm tmp1 tmp2
42#   else
43#       echo skip $dxf missing
44    fi
45}
46
47# check subentity owners
48for year in r14 2000 2004 2007 2010 2013 2018
49do
50    for base in PolyLine3D PolyLine2D
51    do
52        dwg="$DATADIR/${year}/${base}.dwg"
53        dxf="$DATADIR/${year}/${base}.dxf"
54        tgt="../${base}_${year}.dxf"
55        check_subentity
56    done
57done
58for year in r14 2000 2004 2007 2010 2013 2018
59do
60    for base in example Drawing
61    do
62        dwg="$DATADIR/${base}_${year}.dwg"
63        dxf="$DATADIR/${base}_${year}.dxf"
64        tgt="../${base}_${year}.dxf"
65        check_subentity
66    done
67done
68
69check_acdb_dxfname() {
70    if [ -f "$dwg" ] && [ -f "$dxf" ]; then
71        ${top_builddir}/libtool --mode=execute ./dwg2dxf${EXEEXT} -y -v0 -o "$tgt" "$dwg" 2>/dev/null >/dev/null
72        expect="$(grep -c "^$dxfname" "$dxf")"
73        if [ -n "$1" ]; then expect="$1"; fi
74        got=$(grep -c "^$dxfname" "$tgt")
75        if [ "$got" = "$expect" ]
76        then
77            echo "$tgt $dxfname ok"
78        else
79            echo "$tgt $dxfname fail: $got != $expect"
80            i=$((i+1))
81            grep -2 "^$dxfname" "$tgt" >"$log"
82        fi
83    fi
84}
85
86# check handled ACDB* dxfname's
87# UNHANDLED: ACDBDETAILVIEWSTYLE ACDBSECTIONVIEWSTYLE
88for dwg in "$DATADIR"/sample_2*.dwg; do
89    dxf="$(echo "$dwg" | sed 's,.dwg,.dxf,')"
90    tgt="../$(basename "$dxf")"
91    log="$(basename "$tgt").log"
92    rm "./$log" 2>/dev/null
93    for dxfname in ACDBDICTIONARYWDFLT ACDBPLACEHOLDER LAYOUT
94    do
95        check_acdb_dxfname
96    done
97done
98
99# Note that UNSTABLE classes are now skipped, just the single CLASS entry
100for dwg in "$DATADIR"/example_*.dwg; do
101    dxf="$(echo "$dwg" | sed 's,.dwg,.dxf,')"
102    tgt="../$(basename "$dxf")"
103    log="$(basename "$tgt").log"
104    rm "./$log" 2>/dev/null
105    if [ "$tgt" != "../example_r14.dxf" ] && [ "$tgt" != "../example_r13.dxf" ]; then
106        for dxfname in ACDBPERSSUBENTMANAGER ACDBASSOCDEPENDENCY
107        do
108            if [ -z "$enable_debug" ]; then
109                check_acdb_dxfname 1
110            else
111                check_acdb_dxfname
112            fi
113        done
114    fi
115done
116for dwg in "$DATADIR"/2004/Underlay.dwg; do
117    dxf="$(echo "$dwg" | sed 's,.dwg,.dxf,')"
118    tgt="../$(basename "$dxf" .dxf)_2004.dxf"
119    log="$(basename "$tgt").log"
120    rm "./$log" 2>/dev/null
121    for dxfname in PDFDEFINITION PDFUNDERLAY
122    do
123        check_acdb_dxfname
124    done
125done
126
127# check vertex - seqend order
128check_pline_order() {
129    if [ -f "$dwg" ] && [ -f "$dxf" ]; then
130        ${top_builddir}/libtool --mode=execute ./dwg2dxf${EXEEXT} -y -v0 -o "$tgt" "$dwg" 2>/dev/null >/dev/null
131        got="$(grep -E '^(POLYLINE|VERTEX|SEQEND)' "$tgt")"
132        expect="$(grep -E '^(POLYLINE|VERTEX|SEQEND)' "$dxf")"
133        if [ "$got" = "$expect" ]
134        then
135            echo "$tgt" pline order ok
136        else
137            echo "$tgt" pline order fail: "$got"
138            i=$((i+1))
139            echo "expect=$expect" >"$log"
140            echo "got=$got" >>"$log"
141        fi
142    fi
143}
144# check insert - attrib - seqend order
145check_insert_order() {
146    if [ -f "$dwg" ] && [ -f "$dxf" ]; then
147        ${top_builddir}/libtool --mode=execute ./dwg2dxf${EXEEXT} -y -v0 -o "$tgt" "$dwg" 2>/dev/null >/dev/null
148        got="$(grep -E '^(INSERT|ATTRIB|SEQEND)' "$tgt")"
149        expect="$(grep -E '^(INSERT|ATTRIB|SEQEND)' "$dxf")"
150        if [ "$got" = "$expect" ]
151        then
152            echo "$tgt" insert order ok
153        else
154            echo "$tgt" insert order fail: "$got"
155            i=$((i+1))
156            echo "expect=$expect" >"$log"
157            echo "got=$got" >>"$log"
158        fi
159    fi
160}
161
162check_roundtrip() {
163    if [ -f "$dwg" ] && [ -x dxf2dwg ]
164    then
165        dxf="$(basename "$dwg" .dwg).dxf"
166        tgt="$(basename "$dwg")"
167        log1="$(basename "$dwg" .dwg).log1"
168        log2="$(basename "$dwg" .dwg).log2"
169        ${top_builddir}/libtool --mode=execute ./dwg2dxf${EXEEXT} -y -v2 -o "$dxf" "$dwg" 2>"$log1" >/dev/null
170        ${top_builddir}/libtool --mode=execute ./dxf2dwg${EXEEXT} -y -v0 -o "$tgt" "$dxf" 2>/dev/null >/dev/null
171        ${top_builddir}/libtool --mode=execute ./dwgread${EXEEXT} -v2 "$tgt" 2>"$log2" >/dev/null
172        # We dont write unstable entities yet. WIPEOUT is converted to POINT in encode, but skipped at out_dxf
173        if [ -n "$enable_debug" ] && [ -z "$is_release" ]; then
174            expect="$(grep -E '^Add entity' "$log1" | grep -E -c -v 'entity (WIPEOUT|UNKNOWN_ENT)')"
175        else
176            expect="$(grep -E '^Add entity' "$log1" | grep -E -c -v 'entity (WIPEOUT|ARC_DIMENSION|HELIX|UNKNOWN_ENT)')"
177        fi
178        got="$(grep -E -c '^Add entity' "$log2")"
179        rm "./$dxf" "./$tgt" 2>/dev/null
180        if [ "$got" -eq "$expect" ]
181        then
182            echo "$dxf" roundtrip ok
183            rm "$log1" "$log2" 2>/dev/null
184        else
185            echo "$dxf" "roundtrip fail: expect $expect, got $got entities"
186            i=$((i+1))
187            echo "expect=$expect" >"$log"
188            echo "got=$got" >>"$log"
189            /usr/local/bin/perl -nle'/^Add entity (\w+) / && print $1' "$log1" >"$log1".tmp
190            /usr/local/bin/perl -nle'/^Add entity (\w+) / && print $1' "$log2" >"$log2".tmp
191            diff -bu0 "$log1".tmp "$log2".tmp | grep -v '^@@' | tee "$log"
192            rm "$log1".tmp "$log2".tmp 2>/dev/null
193        fi
194    fi
195}
196
197for year in 2007 2018
198do
199    base=PolyLine3D
200    dwg="$DATADIR/${year}/${base}.dwg"
201    dxf="$DATADIR/2013/${base}.dxf"
202    tgt="../${base}_${year}.dxf"
203    log="$(basename "$tgt" .dxf)_pline.dxf.log"
204    rm "./$log" 2>/dev/null
205    check_pline_order
206done
207
208for year in 2000 2004 2007 2010 2013 2018
209do
210    base=example
211    dwg="$DATADIR/${base}_${year}.dwg"
212    dxf="$DATADIR/${base}_${year}.dxf"
213    tgt="../${base}_${year}.dxf"
214    log="$(basename "$tgt" .dxf)_pline.dxf.log"
215    rm "./$log" 2>/dev/null
216    check_pline_order
217done
218
219for year in 2000 2004 2007 2010 2013 2018
220do
221    base=example
222    dwg="$DATADIR/${base}_${year}.dwg"
223    dxf="$DATADIR/${base}_${year}.dxf"
224    tgt="../${base}_${year}.dxf"
225    log="$(basename "$tgt" .dxf)_insert.dxf.log"
226    rm "./$log" 2>/dev/null
227    check_insert_order
228done
229
230for year in 2000 2004 2007 2010 2013 2018
231do
232    base=example
233    dwg="$DATADIR/${base}_${year}.dwg"
234    tgt="../${base}_${year}"
235    log="$tgt.dxf.log"
236    rm "./$log" 2>/dev/null
237    check_roundtrip
238done
239
240if test "0" = "$i" ; then
241    rm ./*.dxf.log 2>/dev/null
242    exit 0
243else
244    echo "$(basename "$0"): $i failures"
245    ls -l ./*dxf.log
246    exit 1
247fi
248