\input regression-test.tex
\documentclass{article}
\usepackage{tikzphysics}

\newdimen\tikzphysicstestx
\newdimen\tikzphysicstesty
\newdimen\tikzphysicstestxx
\newdimen\tikzphysicstestyy
\newdimen\tikzphysicstestdiff
\newdimen\tikzphysicstestexpected

\newcommand{\tikzphysicsgetpoint}[2]{%
  \pgfextractx{\tikzphysicstestx}{\pgfpointanchor{#1}{#2}}%
  \pgfextracty{\tikzphysicstesty}{\pgfpointanchor{#1}{#2}}%
}
\newcommand{\tikzphysicsassertdim}[3]{%
  \tikzphysicstestexpected=#2\relax
  \tikzphysicstestdiff=#1\relax
  \advance\tikzphysicstestdiff by -\tikzphysicstestexpected\relax
  \ifdim\tikzphysicstestdiff<0pt \tikzphysicstestdiff=-\tikzphysicstestdiff\fi
  \ifdim\tikzphysicstestdiff<0.03pt
    \TYPE{PASS: #3}%
  \else
    \TYPE{FAIL: #3 (got \the#1, expected \the\tikzphysicstestexpected)}%
  \fi
}
\newcommand{\tikzphysicsassertpoint}[5]{%
  \tikzphysicsgetpoint{#1}{#2}%
  \tikzphysicstestxx=\tikzphysicstestx
  \tikzphysicstestyy=\tikzphysicstesty
  \tikzphysicsgetpoint{#3}{#4}%
  \tikzphysicsassertdim{\tikzphysicstestxx}{\tikzphysicstestx}{#5 x}%
  \tikzphysicsassertdim{\tikzphysicstestyy}{\tikzphysicstesty}{#5 y}%
}
\newcommand{\tikzphysicsassertnumber}[3]{%
  \pgfmathparse{abs((#1)-(#2))}%
  \ifdim\pgfmathresult pt<0.001pt
    \TYPE{PASS: #3}%
  \else
    \TYPE{FAIL: #3 (difference \pgfmathresult)}%
  \fi
}

\begin{document}
\START

\begin{tikzpicture}
  \node[polar element,element inner radius=1cm,element outer radius=2cm,
    element start angle=30,element delta angle=60] (E) at (0,0) {};
  \tikzphysicsgetpoint{E}{inner-start}
  \pgfmathsetlength{\tikzphysicstestexpected}{1cm*cos(30)}
  \tikzphysicsassertdim{\tikzphysicstestx}{\tikzphysicstestexpected}
    {polar inner-start x}
  \pgfmathsetlength{\tikzphysicstestexpected}{1cm*sin(30)}
  \tikzphysicsassertdim{\tikzphysicstesty}{\tikzphysicstestexpected}
    {polar inner-start y}
  \tikzphysicsgetpoint{E}{outer-end}
  \tikzphysicsassertdim{\tikzphysicstestx}{0pt}{polar outer-end x at 90 degrees}
  \tikzphysicsassertdim{\tikzphysicstesty}{2cm}{polar outer-end radius}
  \tikzphysicsassertpoint{E}{inner-0}{E}{inner-start}{inner arc starts at named anchor}
  \tikzphysicsassertpoint{E}{inner-100}{E}{inner-end}{inner arc ends at named anchor}
  \tikzphysicsassertpoint{E}{outer-0}{E}{outer-start}{outer arc starts at named anchor}
  \tikzphysicsassertpoint{E}{outer-100}{E}{outer-end}{outer arc ends at named anchor}
  \tikzphysicsassertpoint{E}{start-0}{E}{inner-start}{start edge begins at inner radius}
  \tikzphysicsassertpoint{E}{start-100}{E}{outer-start}{start edge ends at outer radius}
  \tikzphysicsassertpoint{E}{end-0}{E}{inner-end}{end edge begins at inner radius}
  \tikzphysicsassertpoint{E}{end-100}{E}{outer-end}{end edge ends at outer radius}
  \tikzphysicsassertdim{\geometryvalue{E}{inner radius}}{1cm}
    {polar geometry inner radius}
  \tikzphysicsassertdim{\geometryvalue{E}{outer radius}}{2cm}
    {polar geometry outer radius}
  \tikzphysicsassertdim{\geometryvalue{E}{radial thickness}}{1cm}
    {polar geometry radial thickness}
  \tikzphysicsassertdim{\geometryvalue{E}{mean radius}}{1.5cm}
    {polar geometry mean radius}
  \tikzphysicsassertnumber{\geometryvalue{E}{start angle}}{30}
    {polar geometry start angle}
  \tikzphysicsassertnumber{\geometryvalue{E}{delta angle}}{60}
    {polar geometry delta angle}
  \tikzphysicsassertnumber{\geometryvalue{E}{end angle}}{90}
    {polar geometry end angle}
\end{tikzpicture}

\begin{tikzpicture}
  \node[differential sector,element outer radius=2cm,
    element start angle=10,element delta angle=40] (S) {};
  \tikzphysicsassertpoint{S}{inner-start}{S}{center}
    {sector inner-start collapses to center}
  \tikzphysicsassertpoint{S}{inner-50}{S}{center}
    {sector inner family collapses to center}
  \tikzphysicsassertdim{\geometryvalue{S}{inner radius}}{0cm}
    {sector preset has zero inner radius}

  \node[differential ring,element inner radius=1.8cm,
    element radial thickness=2mm] (R) at (5,0) {};
  \tikzphysicsassertpoint{R}{centroid}{R}{center}
    {full differential ring centroid equals center}
  \tikzphysicsassertdim{\geometryvalue{R}{outer radius}}{2cm}
    {radial thickness derives outer radius}
  \tikzphysicsassertnumber{\geometryvalue{R}{delta angle}}{360}
    {differential ring preset is a full sweep}

  \node[unwrapped ring,source element=R] (U) at (0,-4) {};
  \tikzphysicsassertdim{\geometryvalue{U}{radial thickness}}{2mm}
    {unwrapped ring copies source thickness}
  \pgfmathsetlength{\tikzphysicstestexpected}{2*pi*1.8cm}
  \tikzphysicsassertdim{\geometryvalue{U}{circumference}}
    {\tikzphysicstestexpected}{unwrapped width uses inner reference circumference}
  \tikzphysicsgetpoint{U}{east}
  \pgfmathsetlength{\tikzphysicstestexpected}{pi*1.8cm}
  \tikzphysicsassertdim{\tikzphysicstestx}{\tikzphysicstestexpected}
    {unwrapped east anchor is half circumference}
  \tikzphysicsassertpoint{U}{bottom-0}{U}{south west}
    {unwrapped bottom family starts at south west}
  \tikzphysicsassertpoint{U}{top-100}{U}{north west}
    {unwrapped top family ends at north west}
\end{tikzpicture}

\setbox0=\hbox{\begin{tikzpicture}
  \node[physics polar element,physics element inner radius=1cm,
    physics element outer radius=2cm,physics element start angle=30,
    physics element delta angle=40] (Long) {};
  \node[polar element,element inner radius=1cm,element outer radius=2cm,
    element start angle=30,element delta angle=40] (Short) {};
  \tikzphysicsassertpoint{Long}{centroid}{Short}{centroid}
    {concise polar element matches collision-safe keys}
  \node[polar element] (DefaultAfter) {};
  \tikzphysicsassertdim{\geometryvalue{DefaultAfter}{inner radius}}{1.8cm}
    {element radii do not leak to later nodes}
  \node[polar element,show dimensions] (Dimensions) at (4,0) {};
  \pic (D) at (5,0) {differential ring diagram={
    element inner radius=1.5cm,element radial thickness=2mm}};
  \tikzphysicsassertdim{\geometryvalue{D-ring}{inner radius}}{1.5cm}
    {ring diagram exposes named ring node}
  \tikzphysicsassertdim{\geometryvalue{D-strip}{radial thickness}}{2mm}
    {ring diagram exposes named strip node}
  \tikzphysicsgetpoint{D-body-east}{center}
  \tikzphysicsassertdim{\tikzphysicstestx}{7cm}
    {ring diagram body radius surrounds the differential ring}
  \TYPE{PASS: dimension overlays and differential ring diagram compile}
\end{tikzpicture}}

\def\elementradiusseen{no}\def\elementradialseen{no}
\def\elementangularseen{no}\def\elementarcseen{no}
\def\elementcircumferenceseen{no}\def\elementwidthseen{no}
\def\elementheightseen{no}
\def\elementradiusprobe{\global\def\elementradiusseen{yes}}
\def\elementradialprobe{\global\def\elementradialseen{yes}}
\def\elementangularprobe{\global\def\elementangularseen{yes}}
\def\elementarcprobe{\global\def\elementarcseen{yes}}
\def\elementcircumferenceprobe{\global\def\elementcircumferenceseen{yes}}
\def\elementwidthprobe{\global\def\elementwidthseen{yes}}
\def\elementheightprobe{\global\def\elementheightseen{yes}}
\setbox0=\hbox{\begin{tikzpicture}
  \node[polar element,show dimensions,
    element radius label={\elementradiusprobe},
    element radial label={\elementradialprobe},
    element angular label={\elementangularprobe},
    element arc label={\elementarcprobe}] {};
  \node[unwrapped ring,show dimensions,
    element circumference label={\elementcircumferenceprobe},
    element radial label={\elementradialprobe}] at (5,0) {};
  \node[rectangular element,show dimensions,
    element width label={\elementwidthprobe},
    element height label={\elementheightprobe}] at (0,-4) {};
\end{tikzpicture}}
\def\elementseenexpected{yes}
\ifx\elementradiusseen\elementseenexpected\TYPE{PASS: polar radius label stays node-local}\else\TYPE{FAIL: polar radius label}\fi
\ifx\elementradialseen\elementseenexpected\TYPE{PASS: radial labels stay node-local}\else\TYPE{FAIL: radial labels}\fi
\ifx\elementangularseen\elementseenexpected\TYPE{PASS: polar angular label stays node-local}\else\TYPE{FAIL: polar angular label}\fi
\ifx\elementarcseen\elementseenexpected\TYPE{PASS: polar arc label stays node-local}\else\TYPE{FAIL: polar arc label}\fi
\ifx\elementcircumferenceseen\elementseenexpected\TYPE{PASS: strip circumference label stays node-local}\else\TYPE{FAIL: strip circumference label}\fi
\ifx\elementwidthseen\elementseenexpected\TYPE{PASS: rectangle width label stays node-local}\else\TYPE{FAIL: rectangle width label}\fi
\ifx\elementheightseen\elementseenexpected\TYPE{PASS: rectangle height label stays node-local}\else\TYPE{FAIL: rectangle height label}\fi

\END
\end{document}
